设计模式 – Factory Method 模式
将实例生成交给子类
在Facotry Method模式中,父类决定实例的生产方式,但并不决定所要生产的具体的类,具体的处理全部交给子类负责.这样就可以将生产实例的框架(framework)和实际负责生产实例的类解耦.
代码实现
下面的例子的作用是制作身份证(ID卡)
- 生成实例的框架(framework包)
/**
* <pre>框架 Creator(创建者)
* 1.createProduct方法是用于生产实例的方法.
* 2.不用new关键字来生成实例,而是调用生成实例的专用方法来生成实例,这样就
* 可以防止父类与其他具体类类耦合.
* </pre>
*/
public abstract class Factory {
public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
}
protected abstract Product createProduct(String owner);
protected abstract void registerProduct(Product product);
}
----------
/**
* <pre> 框架 产品 </pre>
*/
public abstract class Product {
public abstract void use();
}
- 加工处理(idcard包)
/**
* <pre> ConcreteCreator(具体的创建者)</pre>
*/
public class IDCardFactory extends Factory {
private List<String> owners = new ArrayList<>();
@Override
protected Product createProduct(String owner) {
return new IDCard(owner);
}
@Override
protected void registerProduct(Product product) {
owners.add(((IDCard) product).getOwner());
}
public List<String> getOwners() {
return owners;
}
}
----------
import xin.gonefuture.facotryMethod.farmework.Product;
/**
* <pre> ConcreteProduct(具体的产品)</pre>
*/
public class IDCard extends Product {
private String owner;
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;
}
}
制作和使用IDCard
/**
* <pre>使用framework包和idcard包来制作和使用IDCard</pre>
*/
public class Main {
public static void main(String[] args) {
Factory factory = new IDCardFactory();
Product card1 = factory.create("小明");
Product card2 = factory.create("小红");
Product card3 = factory.create("小刚");
card1.use();
card2.use();
card3.use();
}
}
要点
1.框架与具体加工
framework包不依赖于idcard包.
2.生成实例 — 方法的三种实现方法
- 指定为抽象方法.
abstract class Factory {
// 子类必须实现该方法
public abstract Product createProduct(String name);
...
}
- 为其实现默认处理
abstract class Factory {
// 此时因为使用了new关键字,所以不能将Product定义为抽象类.
public Product createProduct(String name) {
return new Product(name);
}
...
}
- 在其中抛出异常
abstract class Factory {
// 如果不在子类覆盖此方法就会报异常.不过需要编写异常类.
public Product createProduct(String name) {
throw new FactoryMethodRuntiemExaception();
}
...
}