🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 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、电脑什么的,难道每一个子类都要对应一个工厂类吗? > 解决上述问题的办法是抽象工厂模式。参考下节........