简介
Factory mode即将实例的生成交给子类(会用到Template mode(将具体处理就给子类))
具体实现
factory包
product类
/**
* 工厂模式(factory Method),将实例的生成交给子类。
* 父类决定实例的生产方式,但并不决定所要生成的具体的类,具体的处理全部交给子类负责。这样可以将生产实例的框架(framework)
* 和实际负责生成实例的类解耦。
* @author Administrator
* Product为"产品"类。该类的实现交给其子类。
*
*/
public abstract class Product {
public abstract void use();
}
factory类
/**
* Factory用到模板模式(将具体的处理交给子类,父类只定义生产流程(规则))
* @author Administrator
*
*/
public abstract class Factory {
//定义工厂(先生成产品,再注册产品)
public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
}
//createProduct()--"用来生产产品",其具体实现交给其子类
protected abstract Product createProduct(String owner);
//registerProduct()--"用来注册产品",其具体实现交给子类
protected abstract void registerProduct(Product p);
}
idcard包
IDCard类
//IDCard负责生产(Product)实例
public class IDCard extends Product {
private String owner;
//使用默认修饰,让外包类不能生产IDCard的实例,必须通过IDFactory生成其实例
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;
}
}
IDCardFactory类
/**
* IDCardFactory生成实例,具体处理类
* @author Administrator
*
*/
public class IDCardFactory extends Factory {
private List owners = new ArrayList();
@Override
//生成IDCard实例
protected Product createProduct(String owner) {
return new IDCard(owner);
}
@Override
protected void registerProduct(Product p) {
owners.add(((IDCard)p).getOwner());
}
public List getOwners() {
return owners;
}
}
main包
main类
public class Main {
public static void main(String[] args) {
//此处Product不能new IDCard生成实例,必须由IDCardFactory生成其实例
Factory factory = new IDCardFactory();
Product card1 = factory.create("小明");
Product card2 = factory.create("小红");
Product card3 = factory.create("小张");
card1.use();
card2.use();
card3.use();
}
}
未完待续
参考文件:
《图解设计模式》【日】结成浩 著 杨文轩 译