设计模式:工厂方法

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

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

如何不修改工厂呢,我们这样想,我们去食品专卖店去买,到专门卖糖果的地方买糖果,专门卖面包的地方买面包,当需要买饼干时,增加一个饼干专卖店即可,不用修改工厂
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的具体工厂类即可,避免了修改类。
原文地址:https://www.cnblogs.com/profession/p/5073050.html