工厂方法模式

来源:互联网 发布:raysource mac 编辑:程序博客网 时间:2024/06/05 20:58
 

工厂方法模式(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();

 

原创粉丝点击