图解设计模式-factory Method模式

用Template Method模式构建生成实例的工厂。
在factory method模式中,父类决定实例的生成方式,但是不决定所要生成的具体类,具体的处理交给子类负责。
 
角色:
Product产品:它定义了在Factory Method模式中的生成的那些实例所持有的接口,由Product类扮演。
Creator创建者:负责生成Product角色的抽象类,由Factory类扮演。
ConcreteProduct具体产品:决定具体的产品,由IDCard类扮演。
ConcreteCreator具体创建者:负责生成具体的产品,有IDCardFactory类扮演此角色。
 
优点:
提供统一实例工厂的框架。
框架与具体实现分开:可以根据不同产品类、创建不同的产品工厂,例如下面代码是IDCard产品与IDCardFactory产品工厂,也可以创建其他的产品和产品工厂。
框架:Product产品抽象类、Factory工厂抽象类
具体实现:IDCard产品类、IDCardFactory产品工厂类
 
代码:
public abstract class Factory {

    public final Product create(String owner) {
        Product product = createProduct(owner);
        register(product);
        return product;
    }

    public abstract Product createProduct(String owner);
    public abstract void register(Product product);
}
public abstract class Product {

    public abstract void use();
}
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;
    }
}
public class IDCardFactory extends Factory {
    List owners = new ArrayList<>();

    @Override
    public Product createProduct(String owner) {
        return new IDCard(owner);
    }

    @Override
    public void register(Product product) {
        owners.add(((IDCard)product).getOwner());
    }
}
public class Main {
    public static void main(String[] args){
        Factory factory = new IDCardFactory();
        Product product1= factory.create("s1");
        Product product2= factory.create("s2");
        Product product3= factory.create("s3");
        product1.use();
        product2.use();
        product3.use();
    }
}
执行结果:
创建s1的ID卡
创建s2的ID卡
创建s3的ID卡
使用s1的ID卡
使用s2的ID卡
使用s3的ID卡
 
代码说明:
Factory抽象类中的create方法定义了创建实例的流程,即调用方法的顺序,先调用createProduct创建产品,在调用register方法把创建的产品进行保存(保存在哪里由具体的工厂决定)。
Product抽象类中use方法定义了被工厂创建的实例中的使用方法,即use方法。(具体实例中方法不用,只起到测试作用,用于确认工厂确实可以创建实例并且调用到对应方法)
IDCardFactory类继承了Factory抽象类,定了createProduct和register方法的具体实现,把创建的实例保存到List集合中。
posted @ 2018-08-30 22:31  使用D  阅读(130)  评论(0编辑  收藏  举报