目录
定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
通用类土
角色
Product(产品)
Product
角色属于框架一方,是一个抽象类。
Creator(创建者)
Creator
角色属于框架一方,负责生成 Product
角色的抽象类,但具体的处理则由子类角色决定。
ConcreteProduct(具体的产品)
ConcreteProduct
角色属于具体加工这一方,它决定具体的产品。
ConcreteCreator(具体的创建者)
ConcreteCreator
角色属于具体加工这一方,负责生成具体的产品。
拓展
生成实例的方法的三种实现:
方法为抽象方法
将创建对象的方法指定为抽象方法。
public abstract class Factory{
public abstract Product create();
}
方法为默认实现
该方法中 Product
不能为抽象类,子类如果重写该方法,则会使用默认的创建方法。
public class Factory{
public Product create(){
return new Product();
};
}
方法中抛异常
public class Factory{
public Product create(){
throw new FactoryMethodRuntimeException();
};
}
该方法需要定义一个专门的异常,而且,如果子类没有重写该类,也不会报异常,直到运行。
实现
/**
* 产品类,一个抽象类
*/
public abstract class Product {
public abstract void use();
}
/**
* 工厂抽象类,其中一些方法使用producted,是保证不可以被外部访问。
*/
public abstract class Factory {
public final Product create(String owner) {
Product product = createProduct(owner);
registProduct(product);
return product;
}
protected abstract Product createProduct(String owner);
protected abstract void registProduct(Product product);
}
/**
* 具体的产品
*/
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卡");
}
}
/**
* 生产具体的ID卡片的工厂
*/
public class IDCardFactory extends Factory {
private List<Product> owers = new ArrayList<>();
@Override
protected Product createProduct(String owner) {
return new IDCard(owner);
}
@Override
protected void registProduct(Product product) {
owers.add(product);
}
}
public class FactoryMethodMain {
public static void main(String[] args) {
Factory factory = new IDCardFactory();
Product zhangsanProduct = factory.create("张三");
Product lisiProduct = factory.create("李四");
zhangsanProduct.use();
lisiProduct.use();
}
}
运行后,会显示:
制作张三的ID卡
制作李四的ID卡
使用张三的ID卡
使用李四的ID卡
模板方法和工厂方法的区别
- 模板方法是在父类中定义算法,算法具体由子类实现
- 工厂方法是生成对象,具体生成什么对象,由每个具体的工厂决定。