设计模式之Factory Method模式
程序员文章站
2022-06-15 12:06:10
...
一、什么是Factory Method模式
在Template Method模式中,在父类的模板方法中定义处理流程,在子类中做具体实现,现在将该模式用于生成实例,也就是Factory Method模式;
在Factory Method模式中,父类决定实例的生成流程,但是它不决定索要生成的是哪一个具体类,具体的处理交给子类负责;这种模式就是将生成实例的框架和实际负责生成实例的具体类进行解耦;
二、案例
实现一个创建身份证的工程,它有创建、注册以及持有者使用等功能;
首先我们先在框架层封装好自己的模板方法流程以及定义好抽象方法,如AbstractFactory,同时封装好抽象的产品类,如AbstractProduct;
然后在一个具体的工程类中完成抽象方法的实现,如IDCardFactory以及产品的具体类实现,如IDCard;
//框架层的抽象工厂
public abstract class AbstractFactory
{
public AbstractProduct Create(string owner){
AbstractProduct product=CreateProduct(owner);
RegisterProduct(product);
return product;
}
protected abstract AbstractProduct CreateProduct(string owner);
protected abstract void RegisterProduct(AbstractProduct product);
}
//抽象的产品类
public abstract class AbstractProduct
{
public abstract void Use();
}
//负责具体实现的ID卡工厂
public class IDCardFactory:AbstractFactory
{
private List<string> owners=new List<string>();
protected override AbstractProduct CreateProduct(string owner){
return new IDCard(owner);
}
protected override void RegisterProduct(AbstractProduct product){
owners.Add(((IDCard)product).GetOwner());
}
public List<string> GetOwners(){
return owners;
}
}
//具体的产品类
public class IDCard:AbstractProduct
{
private string owner;
public IDCard(string owner){
DebugHelper.Log("make "+owner+" ID card\n");
this.owner=owner;
}
public override void Use(){
DebugHelper.Log("use "+owner+" ID card\n");
}
public string GetOwner(){
return owner;
}
}
三、模式分析
工厂模式是Template Method的典型应用,通过抽离出框架层和具体实现层来达到解耦的目的;
如下类图所示,首先是框架层,Creator和Product,在Creator中,我们使用Create来调用抽象方法CreateProduct,而不是使用new关键字来生成实例,从而让实例的具体生成交给子类,防止了父类和其它具体类的耦合;
具体加工层:每一个产品由加工工厂生成,并做统一管理;