3 工厂方法模式

简单工厂存在问题:对象统一行为抽象成一个接口(或者抽象类)之后,再根据传入的类型进行创建实例,但这只适用固定行为的场合,当要实现接口的类型处于不定数,则不适合使用简单工厂模式,而应该使用工厂方法

工厂方法适合场合:
子类有统一的操作行为
子类的数量不固定,随时可能有新的功能子类出现
工厂方法优势:
子类之间是并列的,耦合度比较大
创建具体对象方法灵活,可以使用反射或者第三方IOC容器

  /// <summary>
    /// 菜抽象类
    /// </summary>
    public abstract class Food
    {
        //输出点了什么菜
        public abstract string Print();
    }
    public class TomatoScrambledEggs : Food
    {
        public override string  Print()
        {
            return "西红柿炒鸡蛋";
        }
    }
    public class ShreddedPorkWithPotatoes : Food
    {
        public override string Print()
        {
            return "土豆丝炒鸡蛋";
        }
    }
    /// <summary>
    /// 抽象工厂类
    /// </summary>
    public abstract class Creator
    {
        /// <summary>
        /// 工厂方法
        /// </summary>
        /// <returns></returns>
        public abstract Food CreateFoddFactory();
    }
    /// <summary>
    /// 西红柿炒鸡蛋工厂类
    /// </summary>
    public class TomatoScrambledEggsFactory : Creator
    {
        public override Food CreateFoddFactory()
        {
            return new TomatoScrambledEggs();
        }
    }
    /// <summary>
    /// 土豆丝炒鸡蛋工厂类
    /// </summary>
    public class ShreddedPorkWithPotatoesFactory:Creator
    {
        public override Food CreateFoddFactory()
        {
            return new ShreddedPorkWithPotatoes();
        }
    }
View Code

调用:

  public void Get()
        {
            // 初始化做菜的两个工厂()
            Creator shreddedPorkWithPotatoesFactory = new ShreddedPorkWithPotatoesFactory();
            Creator tomatoScrambledEggsFactory = new TomatoScrambledEggsFactory();

            // 开始做西红柿炒蛋
            Food tomatoScrambleEggs = tomatoScrambledEggsFactory.CreateFoddFactory();
            string dd =  tomatoScrambleEggs.Print();

            //开始做土豆肉丝
            Food shreddedPorkWithPotatoes = shreddedPorkWithPotatoesFactory.CreateFoddFactory();
           string dd2 =  shreddedPorkWithPotatoes.Print();
        }
View Code

 

缺点:

工厂方法是为了克服工厂模式的缺点而设计出来的,每个工厂方法每个具体工厂类只完成单个实例的创建,但是现实生活中,一个工厂只创建单个产品的例子太少啦,所以需要抽象工厂模式:

posted @ 2016-07-04 17:31  那就让我这样吧  阅读(110)  评论(0编辑  收藏  举报