在上一章,模板模式中,我们在父类规定处理的流程,在子类中实现具体的处理。如果我们将该模式用于生成实例,便演变成了Factory模式,即工厂模式。

在Factory模式中,父类决定实例的生成方式,但并不决定所要生成的具体的类,具体处理全部交给子类进行。

设计实例则是模仿Spring框架进行的操作,模拟制作身份证。为了模拟Spring框架解耦,我们采用分包的方法,即生成实例的框架放在framework包中,而加工处理,具体实现的类放在具体实现的idcard包中。

  • framework包中的product类,用于表示产品这一类东西,定义了一个use抽象方法
package site.wangxin520.gof.factory.framework;

/**
 * 仿spring框架,定义的一个工厂类生产的产品类
 * @author wangXgnaw
 *
 */
public abstract class Product {
    
    /**
     * 定义一个顶层抽象方法,用于框架中工厂生产的产品,具体实现交给子类
     */
    public abstract void use();
    
}
  • framework包中的Factory类
package site.wangxin520.gof.factory.framework;

/**
 * 仿spring框架,建立一个Factory工厂,定义三个方法,具体实现交给子类完成。
 * 这里采用的是模板方法
 * @author wangXgnaw
 *
 */
public abstract class Factory {
    
    /**
     * 使用模板方法,具体创建product的实现交给子类
     * @param owner 产品所有者姓名
     * @return Product
     */
    protected abstract Product createProduct(String owner);
    /**
     * 注册product
     * @param product
     */
    protected abstract void registerProduct(Product product);
    
    /**
     * 创建product对象的模板方法
     * @param owner 产品所有者姓名
     * @return Product
     */
    public final Product create(String owner){
        Product p=createProduct(owner);
        registerProduct(p);
        return p;
    }
}
  • idcard包中的IDCard类
package site.wangxin520.gof.factory.idcard;

import site.wangxin520.gof.factory.framework.Product;

/**
 * 身份证的实体类
 * @author wangXgnaw
 *
 */
public class IDCard extends Product{

    /**
     * 隐藏IDCard的构造函数,拒绝外部包访问,外部包只能通过工厂模式进行访问
     */
    IDCard() {
    }
    
    //IDCard的属性
    private String owner;
    public String getOwner() {
        return owner;
    }
    public void setOwner(String owner) {
        this.owner = owner;
    }


    @Override
    public void use() {
        System.out.println(owner+"使用了身份证");
    }

}
  • idcard包中的IDCardFactory类
package site.wangxin520.gof.factory.idcard;

import java.security.acl.Owner;
import java.util.ArrayList;
import java.util.List;

import site.wangxin520.gof.factory.framework.Factory;
import site.wangxin520.gof.factory.framework.Product;

/**
 * 创建身份证的工厂
 * @author wangXgnaw
 *
 */
public class IDCardFactory extends Factory {
    
    //记录登记创建了的产品信息,貌似如果是单例模式的话,就可以直接从这里取值了,最好是map结构(猜测)
    private List<Product> createdProduct=new ArrayList<Product>();
    
    @Override
    protected Product createProduct(String owner) {
        IDCard idCard=new IDCard();
        idCard.setOwner(owner);
        System.out.println("创建了"+owner+"的身份证");
        return idCard;
    }

    @Override
    protected void registerProduct(Product product) {
        createdProduct.add(product);
    }

}
  • 具体测试类
package site.wangxin520.gof.factory.idcard;

import site.wangxin520.gof.factory.framework.Factory;
import site.wangxin520.gof.factory.framework.Product;

/**
 * 测试工厂类
 * @author wangXgnaw
 *
 */
public class FactoryTest {

    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();
        
    }
    
}
  • 最终控制台输出结果为

image

posted on 2017-09-28 07:10  博客王大锤  阅读(243)  评论(0编辑  收藏  举报