设计模式-工厂方法模式(FactoryMethod)
工厂方法模式又称多态工厂模式。工厂方法模式是定义一个创建产品对象的接口(FruitFactory),将具体创建工作给具体的实现类(AppFactory,BananaFactory,PearFactory)。
角色和职责:
1.抽象工厂(factory)-FruitFactory:
工厂方法模式的核心,任何工厂类必须实现这个接口
2.具体工厂(concrete factory)-AppFactory、BananaFactory、PearFactory:
负责实例化产品对象
3.抽象产品(Pruduct)-Fruit:
工厂方法模式所生产的所有对象的父类,负责所有实例共有的接口
4.具体产品(concrete product)-App、 Banana、Pear:
工厂方法模式所生产的具体对象
UML图:
具体代码:
/** * 水果接口类 */ public interface Fruit { void pick(); }
/** * 苹果实现类 */ public class Apple implements Fruit{ @Override public void pick() { System.out.println("采摘苹果"); } }
/** * 香蕉实现类 */ public class Banana implements Fruit{ @Override public void pick() { System.out.println("采摘香蕉"); } }
/** * 梨子实现类 */ public class Pear implements Fruit{ @Override public void pick() { System.out.println("采摘梨子"); } }
/** * 水果工厂接口 */ public interface FruitFactory { public Fruit getFruit(); }
/** * 苹果工厂 */ public class AppFactory implements FruitFactory{ @Override public Fruit getFruit() { return new Apple(); } }
/** * 香蕉工厂 */ public class BananaFactory implements FruitFactory{ @Override public Fruit getFruit() { return new Banana(); } }
/** * 梨子工厂 */ public class PearFactory implements FruitFactory{ @Override public Fruit getFruit() { return new Pear(); } }
public class Main { public static void main(String[] args){ FruitFactory appFactory = new AppFactory();//苹果工厂 Fruit app = appFactory.getFruit(); app.pick();//采摘 FruitFactory bananaFactory = new BananaFactory();//香蕉工厂 Fruit banana = bananaFactory.getFruit(); banana.pick();//采摘 FruitFactory pearFactory = new PearFactory();//梨子工厂 Fruit pear = pearFactory.getFruit(); pear.pick();//采摘 } }
结果:
采摘苹果
采摘香蕉
采摘梨子
优缺点:
优:更符合开-闭原则,新增产品时,只需要增加相应的产品类和对应的工厂类就行了。
缺:添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度。
应用场景:
- 当一个类不知道它所需要的对象的类时
在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可; - 当一个类希望通过其子类来指定创建对象时
在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。 - 将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。
项目源码:https://github.com/qjm201000/design_pattern_factoryMethod.git