设计模式(Java)—Factory Method模式
程序员文章站
2022-06-14 23:28:09
...
用Template Method模式来构建生成实例的工厂,这就是Factroy Method模式,在Factory Method模式中,父类决定实例的生成方式,但并不决定所要生成的具体的类,具体的处理全部交给子类负责,这样就可以将生成实例的框架和实际负责生成实例的类解耦。
一、示例程序
制作身份证卡(ID卡)
此程序中有两个包:
1.生成实例的框架(framework包)
2.加工处理(idcard包)
注:开发对外公开的包时,将域名反着写是默认的包命名方式。
Producet类(framework包):
package Framework;
public abstract class Product {
public abstract void use();
}
该类进声明use抽象方法,use方法的实现则被交给了Product类的子类负责。
Factory类(framework包):
package Framework;
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);
}
IDCard类(idcard包):
package idcard;
import Framework.Product;
public class IDCard extends Product {
private String owner;
private int number;
IDCard(String owner,int number){
System.out.println("制作"+owner+"("+number+")"+"的ID卡");
this.owner = owner;
this.number = number;
}
@Override
public void use() {
// TODO Auto-generated method stub
System.out.println("使用"+owner+"("+number+")"+"的ID卡");
}
public String getOwner(){
return owner;
}
public int getNumber(){
return number;
}
}
注:为了能明显体现出与框架的分离,将这个类放在idcard包中,IDCard类是产品Product类的子类。
IDCardFactory类(idcard包中):
package idcard;
import java.util.HashMap;
import Framework.Factory;
import Framework.Product;
public class IDCardFactory extends Factory {
private HashMap database = new HashMap();
private int number = 100;
@Override
protected Product createProduct(String owner) {
// TODO Auto-generated method stub
return new IDCard(owner,number++);
}
@Override
protected void registerProduct(Product product) {
// TODO Auto-generated method stub
IDCard idCard = (IDCard) product;
database.put(new Integer(idCard.getNumber()),idCard.getOwner());
}
public HashMap getDatabase(){
return database;
}
}
注: createProduct方法用来生成实例,registerProduct方法将持有人保存在HashMap中。
Main类:
import Framework.Factory;
import Framework.Product;
import idcard.IDCardFactory;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Factory factory = new IDCardFactory();
Product card1 = factory.create("小明");
Product card2 = factory.create("小花");
Product card3 = factory.create("小小");
card1.use();
card2.use();
card3.use();
}
}
注:不用new关键字来生成实例,而是调用生成实例的专用方法来生成实例,这样可以防止父类与其他具体类耦合。