介绍
定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。
角色
角色 | 说明 |
---|---|
Factory | 抽象工厂类,负责创建具体产品的实例 |
Product | 抽象产品类,定义产品子类的公共接口 |
ConcreteProduct | 具体产品类,实现 Product 父类的接口功能,也可添加自定义的功能 |
角色示例
类名 | 担任角色 | 说明 |
---|---|---|
Phone | Product | 手机类,定义手机子类的公共接口 |
IPhoneX | ConcreteProduct | IPhoneX 手机类,实现 IPhoneX 类的接口功能,也可添加自定义的功能 |
HUAWEIP40 | ConcreteProduct | HUAWEIP40 手机类,实现 HUAWEIP40 类的接口功能,也可添加自定义的功能 |
PhoneFactory | Factory | 手机工厂类,负责生产手机的实例 |
FactoryTest | Factory | 工厂测试类,负责调用生产什么型号手机 |
UML 类图
普通工厂模式
- 创建 Phone.java,代码如下:
1 | interface Phone{ |
- 创建 HUAWEIP40.java,代码如下:
1 | class HUAWEIP40 implements Phone{ |
- 创建 IPhoneX.java,代码如下:
1 | class IPhoneX implements Phone{ |
- 创建 PhoneFactory.java,代码如下:
1 | class PhoneFactory{ |
- 创建 FactoryTest.java,代码如下:
1 | class FactoryTest { |
- 执行
1 | $ javac FactoryTest.java |
普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象。
多个工厂方法模式
- 修改 PhoneFactory.java,代码如下:
1 | class PhoneFactory{ |
- 修改 FactoryTest.java,代码如下:
1 | class FactoryTest { |
- 执行
1 | $ javac FactoryTest.java |
多个工厂方法模式是提供多个工厂方法,分别创建对象。
静态工厂方法模式
- 修改 PhoneFactory.java,代码如下:
1 | class PhoneFactory{ |
- 修改 FactoryTest.java,代码如下:
1 | class FactoryTest { |
- 执行
1 | $ javac FactoryTest.java |
静态工厂方法模式里的方法是静态,可以直接调用。