参考:https://www.runoob.com/design-pattern/abstract-factory-pattern.html
https://www.cnblogs.com/yssjun/p/11102162.html
工厂模式属于创建型模式,顾名思义用来创建类对象的模式。目前,工厂模式可总结为以下三种:
一、简单工厂模式
简单工厂虽然比较简单,但是这个工厂不简单,客户要求(传参)生产什么,工厂就生产什么。根据不同参数返回不同类的实例。
类图如下:
示例代码:
public class Demo {
public static void main(String[] arg) {
Factory factory = new Factory();
Phone phone = factory.make("phone"); //生产一个手机
Computer computer= factory.make("computer"); // 生产一个电脑
}
}
大部分案例中,简单工厂模式的工厂只是生产某一类产品,只是根据参数不同,产品的部分属性不同。如传参为“小米”和“华为”,则分别生产小米手机和华为手机。本文的例子不知道恰不恰当,请大家参考。
简单工厂的缺点:
- 工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都受到影响;
- 静态工厂,工厂无法形成基于继承的等级结构;
- 扩展困难,增加新产品必须修改工厂逻辑,违反“开闭原则”。产品类型较多时,工厂逻辑复杂,不利于维护。
所以简单工厂适用于简单的应用场景:需要创建的对象较少的情况。
简单工厂解决的主要矛盾是,客户端对产品生产细节的不了解。客户只需要知道产品名字(对应的参数),就可以通过简单工厂创建出对应产品。
二、工厂模式
与简单工厂模式相比工厂模式中的工厂比较“专业”。首先有一个工厂的抽象基类,不负责实际生产,只提供抽象接口,具体生产任务由各工厂子类执行。类图如下:
示例代码:
public class Demo {
public static void main(String[] arg) {
AbstractFactory phoneFactory = new PhoneFactory();
AbstractFactory computerFactory = new ComputerFactory();
phoneFactory.make(); // 生产一个手机
computerFactory.make(); // 生产一个电脑
}
}
优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
三、抽象工厂模式
以上一个工厂只能生产一种产品,如果工厂需要生产多种产品,抽象工厂就要出马了。它解决接口的选择问题。其类图如下:
示例代码:
public class Demo {
public static void main(String[] arg) {
AbstractFactory hwFactory = new HuaweiFactory();
AbstractFactory smFactory = new SamungFactory();
hwFactory.makePhone(); // 生产华为手机
hwFactory.makePC(); // 生产华为PC
smFactory.makePhone(); // 生产sm手机
smFactory.makePC(); // 生产smPC
}
}
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。