工厂方法模式(Factory Method Pattern):
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例延迟到其子类。
工厂方法模式是简单工厂模式的的抽象和推广。在简单工厂模式中,一个工厂类处于对产品类进许实例
化的中心位置,它知道每一个产品类的细节,并决定何时哪一个产品类应当被实例化。简单工厂模式的
优点是能够使客户端独立于产品的创建过程,并且在系统中引入新产品时无需对客户端进许修改,缺点
是当有新产品加入到系统中时,必须修改工厂类,以加入必要的逻辑处理。这就违背了开放--封闭原则。
而工厂方法则很好的解决了这一问题。
实例:兵工厂生成战斗机器
兵工厂能生产出各种战斗机器,但世界上没有一家工厂能够生产出所有的战斗机、坦克、战舰等待。它们都是
由不同的厂家生产的。
/// <summary>
/// Product产品基类:战斗机器
/// </summary>
public abstract class ProductWarMachine
{
public abstract void WarType();
}
/// <summary>
/// ConcreteProduct类:真实的产品类,实现接口Product类
/// 战斗机
/// </summary>
public class Fighter:ProductWarMachine
{
private string _name;
public Fighter(string name)
{
this._name = name;
}
public override void WarType()
{
Console.WriteLine("我是{0}型战斗机", _name);
}
}
/// <summary>
/// 坦克
/// </summary>
public class Tank:ProductWarMachine
{
private string _name;
public Tank(string name)
{
this._name = name;
}
public override void WarType()
{
Console.WriteLine("我是{0}型坦克", _name);
}
}
/// <summary>
/// 战舰
/// </summary>
public class Warship:ProductWarMachine
{
private string _name;
public Warship(string name)
{
this._name = name;
}
public override void WarType()
{
Console.WriteLine("我是{0}型战舰", _name);
}
}
/// <summary>
/// 工厂接口:声明工厂方法,返回一个真实产品
/// </summary>
public interface IFactory
{
/// <summary>
/// 用于实例化真实产品类
/// </summary>
/// <returns></returns>
ProductWarMachine CreateArmShop(string name);
}
/// <summary>
/// ConcreteFactory:真实工厂类
/// 创建一个战斗机类
/// </summary>
public class FighterFactory:IFactory
{
#region IFactory 成员
public ProductWarMachine CreateArmShop(string name)
{
return new Fighter(name);
}
#endregion
}
/// <summary>
/// 创建一个坦克类
/// </summary>
public class TankFactory:IFactory
{
#region IFactory 成员
public ProductWarMachine CreateArmShop(string name)
{
return new Tank(name);
}
#endregion
}
/// <summary>
/// 创建一个战舰类
/// </summary>
public class WarshipFactory:IFactory
{
#region IFactory 成员
public ProductWarMachine CreateArmShop(string name)
{
return new Warship(name);
}
#endregion
}
应用:
//工厂方法模式
IFactory factory = new FighterFactory();
ProductWarMachine fighter = factory.CreateArmShop("歼10");
fighter.WarType();
IFactory factory2 = new TankFactory();
ProductWarMachine tank = factory2.CreateArmShop("M1A1");
tank.WarType();