欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

图解设计模式 - Factory Method 模式

程序员文章站 2022-06-15 11:31:00
...

读书笔记 仅供参考

Factory Method

将模板方法模式用于生产实例,就是工厂方法模式了。在 Factory Method 模式中,父类决定了实例的生成方式,但是并不决定所要生成的具体的类,具体的处理交给子类负责。

UML 和角色

图解设计模式 - Factory Method 模式

Product

Product 是一个抽象类,定义了在模式中生成的实例所需要实现的接口,具体的处理由子类 ConcreteProduct 决定。

Creator

Creator 是负责生成 Product 角色的抽象类,具体的处理由子类决定。Creator 中的 create 方法相当于 Template Method 模式中的模型方法,实现了生成实例的过程,factoryMethod 则是需要子类实现的方法。

ConcreteProduct

ConcreteProduct 决定了具体的产品

ConcreteCreator

ConcreteCreator 负责生成具体的产品

例子

代码:
https://github.com/wujunyucg/DesignPattern/tree/master/src/chapter02/factoryMethod

Factory 类,相当于 Creator。

public abstract class Factory {
    //定义了产品生产的流程
    public final Product create(String owner) {
        Product p = createProduct(owner);
        registerProduct(p);
        return p;
    }

    protected abstract Product createProduct(String owner);
    protected abstract void registerProduct(Product product);
}

Product 类

public abstract class Product {
    public abstract void use();
}

IDCardFactory 类,继承了 Factory 类,相当于 ConcreteCreator。

public class IDCardFactory extends Factory {
    private List<String> owers = new ArrayList<>();
    @Override
    protected Product createProduct(String owner) {
        return new IDCard(owner);
    }

    @Override
    protected void registerProduct(Product product) {
        owers.add(((IDCard)product).getOwner());
    }

    public List<String> getOwers() {
        return owers;
    }
}

IDCard 类,继承了 Product 类,相当于 ConcreteProduct 。

public class IDCard extends Product {
    private String owner;

    public IDCard(String owner) {
        System.out.println("制作" + owner + "的ID卡");
        this.owner = owner;
    }

    @Override
    public void use() {
        System.out.println("使用" + owner + "的ID卡");
    }

    public String getOwner() {
        return owner;
    }
}

Main 类测试

public class Main {
    public static void main(String[] args) {
        Factory factory = new IDCardFactory();
        Product card1 = factory.create("小明");
        Product card2 = factory.create("小红");
        Product card3 = factory.create("小刚");
        card1.use();
        card2.use();
        card3.use();
    }
}

效果
图解设计模式 - Factory Method 模式

UML
图解设计模式 - Factory Method 模式

实现 createProduct 方法的三种方式

  • 定义为抽象方法,子类必须实现
  • 通过构造方法,但是不能再将超类定义为抽象类
  • 在超类 create 方法抛出异常,子类如果不重写此方法,就会抛出异常,无法运行。

相关的设计模式

Template Method 模式

create 方法就是模板方法

Singleton 模式

可以将 Singleton 模式用于扮演 Creator 或 ConcreteCreaor 角色,在场景中不需要有多个 Creator。

Iterator 模式

在 Iterator 模式中生成 iterator 可以使用 Factory Method 模式。

Composite 模式

可以将 Composite 模式用于 Product 角色