简单工厂
介绍
提供一个创建对象实例的功能,而无须关心具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体实现的类
实例
类图如下
UML图的解释:
- Car为抽象类
- VanCar和MiniCar为Car的子类
- WuliFactory创建负责创建这两个对象(通过黄色部分逻辑判断)
抽象汽车接口
为什么要抽象出一个汽车接口呢?我们直接生成汽车类不行吗?
这里其实也体现了设计模式7大原则中的依赖倒置原则,也就是面向接口编程。同时也能体现出开闭原则,对扩展开放,对修改关闭。如果需要新的汽车,那么就新建一个类去实现这个接口即可!(不改变源代码,而是对其扩展)
public interface AbstractCar { void run(); }
汽车实现类
public class BenchiCar implements AbstractCar{ @Override public void run() { System.out.println("我是奔驰,我可以跑跳着跑!"); } } public class WulingCar implements AbstractCar{ @Override public void run() { System.out.println("我是五菱,我能飞!"); } }
简单工厂
这个工厂很简单,就是提供了一个方法。可以根据传来的参数创建相应的对象
public class CarFactory { public AbstractCar returnCar(String type) { if ("Benchi".equals(type)) { return new BenchiCar(); } else if ("Wuling".equals(type)) { return new WulingCar(); } //......有新的汽车进来,那就需要改变造车厂的逻辑,在添加if,else return null; } }
会员端
我们在会员端来体会一下简单工厂的作用:
- new这个简单工厂
- 调用简单工厂中创建对象的方法
- 运行对应对于的方法
通过运行结果我们可以发现,我们只需要创建工厂然后调用里面的方法对象就被创建出来了。这不就是我们前面说的隐藏了对象的创建细节,并提供一个创建对象的通用接口,实现了解耦。
public class Client { public static void main(String[] args) { CarFactory factory = new CarFactory(); AbstractCar benci = factory.returnCar("Benchi"); AbstractCar wuling = factory.returnCar("Wuling"); benci.run(); wuling.run(); } }
我是奔驰,我可以跑跳着跑!我是五菱,我能飞!
总结
1.使用的场景?
如果想要完全的封装和隔离具体的实现,让外部只能通过接口来操作封装部分,那这个时候选择简单工厂。
如果想把创建对象的工作集中管理,可以选用简单工厂
2.本质是什么?
选择实现
为什么是选择实现?因为简单工厂已经把对象创建好了,客户端只需要进行选择即可。 这样也可以使客户端和实现之间解耦。如果你的实现发生了变化,也不需要动客户端的代码。
3.它解决了什么问题?
- 将类的实例化和对象的操作分开,避免了在客户端代码中显示指定,实现了解耦
- 屏蔽了使用细节,消费者可以直接使用
4.它体现了设计模式中什么原则?
面向接口编程(依赖倒置原则)
5.存在的缺陷?
- 可能增加客户端的复杂度:客户端需要理解参数是什么意义,同时也暴露了内部的实现
6.你认为与它相关的设计模式有哪些? 它们之间的区别有哪些?
后期更新...