在设计模式中,工厂相关的模式有三种:简单工厂、工厂方法、抽象工厂。
使用场景:
1.在编码时不能预见需要创建哪种产品类的实例。
2.客户端不需要关心产品类的实例化过程。
1. 简单工厂
组成:
一个抽象的产品IProduct(接口或抽象类);
一个非抽象工厂类Factory;
类图:
//客户端示例:
Factory factory = new Factory();
Iproduct pA = factory.createProduct("A");
pA.doSomething();
Iproduct pB = factory.createProduct("B");
pB.doSomething();
场景举例:
麦当劳成立初期,他们的产品只有汉堡,汉堡有“奥尔良鸡腿堡”、“双层牛肉煲”等类型。客户要什么,只需要工厂根据汉堡类型创建相应的汉堡就行了。
另外需要注意的是:当具体的产品种类比较多时,为了防止类爆炸,在工厂方法模式中可以使用简单工厂模式,类似的产品(兄弟节点的产品)可以用简单工厂模式创建。简单工厂可以理解为是工厂方法的一种特殊情况。
缺点:
如果新增一类产品,不仅需要扩展产品的具体类,还要修改工厂的创建方法,使工厂能够创建新增的汉堡。这就违反了“开闭原则”。
2. 工厂方法
组成:
一个抽象的产品IProduct(接口或抽象类);
一个抽象工厂类IFactory(接口或抽象类);
多个具体产品实现类;
多个具体工厂实现类,并且一个具体工厂类负责创建一个产品;
类图:
客户端示例:
IFactory factoryA = new FactoryA();
Iproduct pA = factoryA.createProduct();
pA.doSomething();
IFactory factoryB = new FactoryB();
Iproduct pB = factoryB.createProduct();
pB.doSomething();
场景举例:
随着用户需求的增加,会新增汉堡类型。扩展相应的产品和工厂实现就行了。
3. 抽象工厂
组成:
多种抽象的产品IProduct(接口或抽象类);
一个抽象工厂类IFactory(接口或抽象类);
多个具体产品实现类(不同种类的产品之间总是以某种品牌的方式成组出现);
多个具体工厂实现类,并且一个具体工厂类负责为某种品牌创建具体的产品组;
类图:
客户端示例:
IFactory factory4XiaoMi = new FactoryForXiaoMi();
Iproduct pA = factory4XiaoMi.createProductA();
Iproduct pB = factory4XiaoMi.createProductB();
Iproduct pC = factory4XiaoMi.createProductC();
IFactory factory4MeiZu = new FactoryForMeiZu();
Iproduct pA = factory4MeiZu.createProductA();
Iproduct pB = factory4MeiZu.createProductB();
Iproduct pC = factory4MeiZu.createProductC();
场景举例:
手机组件由屏幕、机壳、cpu等不同种类的产品组成;
不同的手机生产商需要的手机组件不同;比如华为、小米、魅族生产手机时,用的手机组件是不同的;
这时,由不同的工厂实现类负责为不同的手机生产商创建手机组件就行了;
总结:
曾经一名老师说过,设计模式只是很好的给我们提供思路和解决方案,我们自己在设计时,不必非得严格按照类图来,要灵活设计,理解设计模式的精髓才是重要的。我很赞同这一点!