Factory Method模式

Factory Method模式

Factory Method模式

在Template Method模式中,是在父类中规定处理的流程,在子类中实现具体的处理。而在Factory Method模式中,是用Template Method模式生成实例,父类决定实例的生成方式,但并不决定所要生成的具体类,具体的处理全部交给子类处理,这样就可以将生成实例的框架和实际负责生成实例的类解耦。

示例程序

1、Product类
是所有产品类的抽象父类,只要继承Product的类都可以在Factroy中创建实例。

package com.design.pattern4;

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

2、Factory类
定义和实现了创建Product实例的模板方法,以及需要子类实现的抽象方法。

package com.design.pattern4;

public abstract class Factory {
    //抽象方法
    public abstract Product createProduct(String owner);
    public abstract void registerProduct(Product product);
    
    //模板方法,创建Product实例
    public final Product create(String owner){
        Product p = createProduct(owner);
        registerProduct(p);
        return p;
    }
}

3、IdCard类(产品子类)
具体的产品类,这里通过继承Product类来通过Factory创建实例,并且构造函数Idcard并没有加修饰符,主要是为了迫使通过Factory来创建实例,而非new。

package com.design.pattern4;

public class IdCard extends Product{
    private String owner;

    public String getOwner() {
        return owner;
    }
    //只有同一个包下的类才能调用此构造方法
    IdCard(String owner) {
        System.out.println("初始化");
        this.owner = owner;
    }

    @Override
    public void use() {
        System.out.println(owner);
    }
}

4、IdCardFactory(Factory子类)
和Templete Method模式中的子类一样,实现父类Factory中的抽象方法。

package com.design.pattern4;

import java.util.ArrayList;
import java.util.List;

public class IdCardFactory extends Factory{
    private List<String> owners = new ArrayList<>();

    public List<String> getOwners() {
        return owners;
    }

    @Override
    public Product createProduct(String owner) {
        //返回具体的产品子类
        return new IdCard(owner);
    }

    @Override
    public void registerProduct(Product product) {
        owners.add(((IdCard)product).getOwner());
    }
}

5、Main类

package com.design.pattern4;

public class Main {
    public static void main(String[] args) {
        Factory factory = new IdCardFactory();
        Product p1 = factory.create("张三");
        Product p2 = factory.create("李四");
        Product p3 = factory.create("王五");
        p1.use();
        p2.use();
        p3.use();
    }
}

Factory Method模式需要四个元素:
1、Product类
它是一个抽象类,定义了在Factory Method模式中生成的实例所持有的方法(use),但具体处理交给子类。
2、Creator(创建者)
负责生成Product实例的抽象类,但具体的处理(抽象方法)交给子类,并且,创建方法用createProduct来创建实例,而非new,很大程度上防止父类与其他具体类的耦合。
3、ConcreteProduct(具体产品)
4、ConcreteCreator(具体创建者)
实现Factory中的抽象方法,也就是生成具体的产品实例。

上一篇:区块链开发之Corda训练营笔记12:Flow习题答案


下一篇:Oracle查看占用表空间最大的表(排序)