• 设计模式:工厂方法


    在简单工厂模式中,将实例化对象的工作推迟到了专门负责创建对象的工厂类中,可以根据我们预知动态创建产品类。但是,一旦客户的变化超过预知我们就必须修改我们的源代码(FoodShop工厂)了。

    switch (foodName)
    {
        case "Sugar":
            return new Sugar();                    
        case "Bread":
            return new Bread();
        default:
            throw new ArgumentException();                    
    }

    如何不修改工厂呢,我们这样想,我们去食品专卖店去买,到专门卖糖果的地方买糖果,专门卖面包的地方买面包,当需要买饼干时,增加一个饼干专卖店即可,不用修改工厂

    image

    namespace DP
    {
        class Client
        {
            static void Main(string[] args)
            {
                // 可以从配置文件里确定具体工厂
                // IFoodshop factory = (IFoodshop)Assembly.Load("DP").
                //                     CreateInstance("SugarShop");
                IFoodshop sugarShop = new SugarShop();
    
                IFood food = sugarShop.CreateFood();
                food.Eat();
                Console.Read();
            }
        }
    
        // 抽象产品
        public interface IFood
        {
            void Eat();
        }
    
        // 具体产品
        public class Bread : IFood
        {
    
            public void Eat()
            {
                Console.WriteLine("Bread is delicious!");
            }
        }
    
        // 具体产品
        public class Sugar : IFood
        {
    
            public void Eat()
            {
                Console.WriteLine("Sugar is delicious!");
            }
        }
    
        // 抽象工厂
        public interface IFoodshop
        {
            IFood CreateFood();
            
        }
    
        // 具体工厂
        public class SugarShop : IFoodshop
        {
            public IFood CreateFood()
            {
                return new Sugar();
            }
           
        }
    
        // 具体工厂
        public class BreadShop : IFoodshop
        {
            public IFood CreateFood()
            {
                return new Bread();
            }
    
        }
        
    }
    
    
    当增加一种食品时,我们只需要创建一个实现IFood的食品和一个实现了IFactory的具体工厂类即可,避免了修改类。
  • 相关阅读:
    Magento安装教程
    让老婆爱你的十大方法。
    easy ui layout设计
    下交叉综合症
    fileloder.js+struts2实现文件异步上传,无页面刷新效果。
    将mysql中的Blob的图片在jsp中显示
    详解CSS样式的position属性
    Struts2与Spring的整合
    Play Framework常用标签list,set,如何遍历list、map类型数据
    我所理解的团队
  • 原文地址:https://www.cnblogs.com/cnblogsfans/p/1611322.html
Copyright © 2020-2023  润新知