工厂方法模式(Factory Method):将创建一个产品的任务,推迟到子类中。核心工厂类不再负责产品的创建。
这样核心类成为一个抽象工厂。负责具体子类工厂必须实现的接口。这样的好处是在不改变具体子类工厂的前提下
增加新的产品。
工厂方法模式角色与结构:
抽象工厂角色(AbstractFactory):是工厂方法模式的核心,创建的子类工厂必须实现这个接口。
具体工厂角色(Concrete Creator):实现抽象工厂的具体工厂类,包含与应用程序密切相关的逻辑,
并且受到应用程序调用创建产品对象。如ProductAFactory,ProductBFactory
抽象产品角色(Product):工厂方法模式创建的对象的基类或者接口。
具体产品角色(Concrete Product):实现了抽象产品角色的具体类。其对象由具体工厂创建产生。他们之间一般为一一对应。
代码:
/// <summary>
/// 抽象工厂
/// </summary>
public abstract class AbstractFactory
{
public abstract Product Factory();
}
/// <summary>
/// 产品A的创建工厂
/// </summary>
public class ProductAFactory:AbstractFactory
{
public override Product Factory()
{
return new ConcreteProductA();
}
}
/// <summary>
/// 产品B的创建工厂
/// </summary>
public class ProductBFactory : AbstractFactory
{
public override Product Factory()
{
return new ConcreteProductB();
}
}
/// <summary>
/// 产品抽象类
/// </summary>
public abstract class Product
{
/// <summary>
/// 唯一标识
/// </summary>
public string ID
{
get;
set;
}
/// <summary>
/// 产品名称
/// </summary>
public string Name
{
get;
set;
}
public abstract void Operate();
public void GetName()
{
Console.WriteLine("the name of Product is "+Name);
}
}
/// <summary>
/// 产品A
/// </summary>
public class ConcreteProductA : Product
{
public override void Operate()
{
Console.WriteLine("this is the Class if ConcreteProductA");
}
}
/// <summary>
/// 产品B
/// </summary>
public class ConcreteProductB : Product
{
public override void Operate()
{
Console.WriteLine("this is the Class if ConcreteProductB");
}
}
class Program
{
static void Main(string[] args)
{
#region 工厂方法模式
AbstractFactory factoryA = null; // 工厂A
Product productA = null; // 产品A
factoryA = new ProductAFactory();
productA = factoryA.Factory();
productA.Name = "ProductA";
productA.Operate();
productA.GetName();
AbstractFactory factoryB = null; // 工厂B
Product productB = null; // 产品B
factoryB = new ProductBFactory();
productB = factoryB.Factory();
productB.Name = "ProductB";
productB.Operate();
productB.GetName();
return;
}
}