设计模式-工厂方法模式(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

原文地址:https://www.cnblogs.com/qjm201000/p/10053333.html