## 1. 定义
>每个子类都对应一个工厂子类,利用多态特性动态创建对象的模式,就是工厂方法模式。
## 2. 场景
>**复习:** 简单工厂模式--- 创建一个工厂类,专门用于对象的创建(根据传入不同的参数,创建不同的对象)
>**问题:** 如果新增加一个手机子类,手机工厂就要增加新的if-else判断,违反了开闭原则(对扩展开放、对修改关闭)
>**解决方法:** 可以为每一个手机子类创建对应的工厂子类,这些子类分别实现抽象的工厂接口,这样我们只需实例化不同的工厂子类,调用创建方法,得到的就是对应的手机对象,是背后是面向对象的多态特性。
## 3. 重构简单工厂代码
`重构代码:`
> 每个子类都有自己对应的工厂类
~~~
public interface IPhone {
void packaging();
}
~~~
~~~
public interface PhoneFactory {
IPhone packaging();
}
~~~
~~~
public class HWPhone implements IPhone {
@Override
public void packaging() {
System.out.println("华为手机");
}
}
~~~
~~~
public class HWPhoneFactory implements PhoneFactory {
@Override
public IPhone packaging() {
System.out.println("这是生产华为手机工厂");
return new HWPhone();
}
}
~~~
~~~
public class MIPhone implements IPhone {
@Override
public void packaging() {
System.out.println("小米手机");
}
}
~~~
~~~
public class MIPhoneFactory implements PhoneFactory {
@Override
public IPhone packaging() {
System.out.println("这是生产小米手机的工厂");
return new MIPhone();
}
}
~~~
~~~
public class Store {
public void sellPhone(PhoneFactory phone) {
phone.packaging();
}
}
~~~
`测试类:`
~~~
public class TestFactory {
public static void main(String[] args) {
PhoneFactory hwPhone = new HWPhoneFactory();
PhoneFactory xmPhone = new MIPhoneFactory();
Store store = new Store();
store.sellPhone(hwPhone);
}
}
~~~
## 4. 代码结构图
![](https://img.kancloud.cn/15/f8/15f85874de8dfef04823cb2a91cce44e_1117x533.png)
## 5. 总结
> 由此可以看出工厂方法规避了简单工厂if-else造成的判断,并且也解决了新添加手机子类需要修改原工厂类的代码,符合了开闭原则。
> 但是如果需要创建的子类越来越多,不止只有手机,还有ipad、电脑什么的,难道每一个子类都要对应一个工厂类吗?
> 解决上述问题的办法是抽象工厂模式。参考下节........
- 前言
- 第一章 设计七大原则
- 第1节 开闭原则
- 第2节 依赖倒置原则
- 第3节 单一职责原则
- 第4节 接口隔离原则
- 第5节 迪米特法则
- 第6节 里氏替换原则
- 第7节 合成复用原则
- 第二章 简单工厂模式
- 第1节 使用场景
- 第2节 示例代码
- 第三章 创建者模式
- 第1节 工厂方法模式
- 第2节 抽象工厂模式
- 第3节 建造者模式
- 第4节 原型模式
- 第5节 单例模式
- 第四章 结构型模式
- 第1节 适配器模式
- 第2节 桥接模式
- 第3节 组合模式
- 第4节 装饰者模式
- 第5节 外观模式
- 第6节 享元模式
- 第7节 代理模式
- 第五章 行为模式
- 第1节 责任链模式
- 第2节 命令模式
- 第3节 迭代器模式
- 第4节 中介者模式
- 第5节 备忘录模式
- 第6节 观察者模式
- 第7节 状态模式
- 第8节 策略模式
- 第9节 模板方法模式
- 第10节 访问者模式
- 第11节 解释器模式