工厂方法模式(Observers)  定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类.封装具体类型的实例化。提供创建对象的方法的接口也称为“工厂方法”。任何其他实现的方法都可能使用到这个工厂方法所制造出来的产品,但只有子类真正实现这个工厂方法并创建产品。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。尽管只有一个具体创建者依然可以使用,它帮助我们将产品的“实现”从“使用”中解藕。
     在本次Dome中,采用的方式是"参数化工厂方法",它可以更具传入的参数创建不同的对象,然而,工厂经常只产生一种对象,不需要参数化,模式的这两种形式都是有效的,
     松耦合的设计之所以能让我们建立有弹性的OO系统,能够应对变化,是因为对象之间的互相依赖降到了最低。所以我们为了交互对象之间的松耦合设计而在努力。
Demo - 国际面包店
   该面包店可以生产多种不同的面包,同样种类的面包在不同国家生产的面包口味有所不一样,那么在这样的设计中,首先工厂,是必须可以随时扩展,当然面包的种类也会越来越多.~
工厂模式_职场
工厂模式_设计模式_02namespace Exercise.FactoryPattern
工厂模式_设计模式_02{
工厂模式_设计模式_02    public class Program
工厂模式_设计模式_02    {
工厂模式_设计模式_02
工厂模式_设计模式_02        /// <summary>
工厂模式_设计模式_02        /// 程序主入口.
工厂模式_设计模式_02        /// </summary>
工厂模式_设计模式_02        /// <param name="s"></param>
工厂模式_设计模式_02        static void Main(string[] s)
工厂模式_设计模式_02        {
工厂模式_设计模式_02            BreadFactory chinaFactory = new ChinaFactory();
工厂模式_设计模式_02
工厂模式_设计模式_02            chinaFactory.OrderBread(BreadType.cheese);
工厂模式_设计模式_02
工厂模式_设计模式_02            BreadFactory thailandFactory = new ThailandFactory();
工厂模式_设计模式_02
工厂模式_设计模式_02            thailandFactory.OrderBread(BreadType.cheese);
工厂模式_设计模式_02
工厂模式_设计模式_02            thailandFactory.OrderBread(BreadType.veggie);
工厂模式_设计模式_02
工厂模式_设计模式_02            Console.Read();
工厂模式_设计模式_02        }
工厂模式_设计模式_02    }
工厂模式_设计模式_02
工厂模式_设计模式_02    /// <summary>
工厂模式_设计模式_02    /// 面包种类
工厂模式_设计模式_02    /// </summary>
工厂模式_设计模式_02    public enum BreadType
工厂模式_设计模式_02    {
工厂模式_设计模式_02        cheese,
工厂模式_设计模式_02        veggie
工厂模式_设计模式_02    }
工厂模式_设计模式_02
工厂模式_设计模式_02    /// <summary>
工厂模式_设计模式_02    ///  BreadStor 通过 SimpleBreadFactory 获得面包的实例
工厂模式_设计模式_02    /// </summary>
工厂模式_设计模式_02    public abstract class BreadFactory {
工厂模式_设计模式_02
工厂模式_设计模式_02        public abstract Bread CreateBread(BreadType BreadType);
工厂模式_设计模式_02
工厂模式_设计模式_02        public void OrderBread(BreadType BreadType){
工厂模式_设计模式_02
工厂模式_设计模式_02            //使用简单传入订单类型来使用工厂创建的面包
工厂模式_设计模式_02
工厂模式_设计模式_02            Bread Bread = CreateBread(BreadType);                        
工厂模式_设计模式_02 
 #region "这是无需改变的地方 这是每个面包都需要发生的动作.."
工厂模式_设计模式_02
工厂模式_设计模式_02            Bread.Prepare();
工厂模式_设计模式_02
工厂模式_设计模式_02            Bread.Bake();
工厂模式_设计模式_02
工厂模式_设计模式_02            Bread.Cut();
工厂模式_设计模式_02
工厂模式_设计模式_02            Bread.Box();
工厂模式_设计模式_02
工厂模式_设计模式_02            #endregion
工厂模式_设计模式_02        }    
工厂模式_设计模式_02    }
工厂模式_设计模式_02
工厂模式_设计模式_02
工厂模式_设计模式_02    /// <summary>
工厂模式_设计模式_02    /// 中国工厂创建的面包  应用中唯一用到具体面包类的地方
工厂模式_设计模式_02    /// </summary>
工厂模式_设计模式_02    public class ChinaFactory : BreadFactory
工厂模式_设计模式_02    {
工厂模式_设计模式_02        /// <summary>
工厂模式_设计模式_02        ///  构建具体面包实例的地方 随着时间过去 面包的种类或者菜单改变 这里就必须一改再改.
工厂模式_设计模式_02        /// </summary>
工厂模式_设计模式_02        public override Bread CreateBread(BreadType BreadType)
工厂模式_设计模式_02        {
工厂模式_设计模式_02            Bread Bread = null;
工厂模式_设计模式_02
工厂模式_设计模式_02            if (BreadType.Equals(BreadType.cheese))
工厂模式_设计模式_02            {
工厂模式_设计模式_02                Bread = new ChinaCheeseBread();
工厂模式_设计模式_02            }
工厂模式_设计模式_02            else if (BreadType.Equals(BreadType.veggie))
工厂模式_设计模式_02            {
工厂模式_设计模式_02                Bread = new ChinaVeggieBread();
工厂模式_设计模式_02            }
工厂模式_设计模式_02            else
工厂模式_设计模式_02            {
工厂模式_设计模式_02                throw new Exception("no have Bread..");
工厂模式_设计模式_02            }
工厂模式_设计模式_02
工厂模式_设计模式_02            return Bread;
工厂模式_设计模式_02        }
工厂模式_设计模式_02    }
工厂模式_设计模式_02
工厂模式_设计模式_02
工厂模式_设计模式_02    /// <summary>
工厂模式_设计模式_02    /// 泰国工厂创建的面包  应用中唯一用到具体面包类的地方
工厂模式_设计模式_02    /// </summary>
工厂模式_设计模式_02    public class ThailandFactory : BreadFactory
工厂模式_设计模式_02    {
工厂模式_设计模式_02        /// <summary>
工厂模式_设计模式_02        ///  构建具体面包实例的地方 随着时间过去 面包的种类或者菜单改变 这里就必须一改再改.
工厂模式_设计模式_02        /// </summary>
工厂模式_设计模式_02        public override Bread CreateBread(BreadType BreadType)
工厂模式_设计模式_02        {
工厂模式_设计模式_02            Bread Bread = null;
工厂模式_设计模式_02
工厂模式_设计模式_02            if (BreadType.Equals(BreadType.cheese))
工厂模式_设计模式_02            {
工厂模式_设计模式_02                Bread = new ThailandCheeseBread();
工厂模式_设计模式_02            }
工厂模式_设计模式_02            else if (BreadType.Equals(BreadType.veggie))
工厂模式_设计模式_02            {
工厂模式_设计模式_02                Bread = new ThailandVeggieBread();
工厂模式_设计模式_02            }
工厂模式_设计模式_02            else
工厂模式_设计模式_02            {
工厂模式_设计模式_02                throw new Exception("no have Bread..");
工厂模式_设计模式_02            }
工厂模式_设计模式_02
工厂模式_设计模式_02            return Bread;
工厂模式_设计模式_02        }
工厂模式_设计模式_02    }
工厂模式_设计模式_02
工厂模式_设计模式_02
工厂模式_设计模式_02    /// <summary>
工厂模式_设计模式_02    /// 面包抽象类
工厂模式_设计模式_02    /// </summary>
工厂模式_设计模式_02    public abstract class Bread
工厂模式_设计模式_02    {
工厂模式_设计模式_02        public void Prepare() { Console.WriteLine("准备.."); }
工厂模式_设计模式_02
工厂模式_设计模式_02        public void Bake() { Console.WriteLine("烘烤.."); }
工厂模式_设计模式_02
工厂模式_设计模式_02        public void Cut() { Console.WriteLine("剪切.."); }
工厂模式_设计模式_02
工厂模式_设计模式_02        public void Box() { Console.WriteLine("包装.."); }
工厂模式_设计模式_02    }
工厂模式_设计模式_02 
 "#region "具体产品 每个产品都会实现Bread接口
   - (实现接口指实现某个超类型 可以是类或接口的 某个方法)"
工厂模式_设计模式_02
工厂模式_设计模式_02    /// <summary>
工厂模式_设计模式_02    /// 奶香面包
工厂模式_设计模式_02    /// </summary>
工厂模式_设计模式_02    public class ChinaCheeseBread : Bread
工厂模式_设计模式_02    {
工厂模式_设计模式_02       public ChinaCheeseBread()
工厂模式_设计模式_02        {
工厂模式_设计模式_02            Console.WriteLine("中国奶香面包");
工厂模式_设计模式_02        }
工厂模式_设计模式_02    }
工厂模式_设计模式_02
工厂模式_设计模式_02    /// <summary>
工厂模式_设计模式_02    /// 奶香面包
工厂模式_设计模式_02    /// </summary>
工厂模式_设计模式_02    public class ThailandCheeseBread : Bread
工厂模式_设计模式_02    {
工厂模式_设计模式_02        public ThailandCheeseBread()
工厂模式_设计模式_02        {
工厂模式_设计模式_02            Console.WriteLine("泰国奶香面包");
工厂模式_设计模式_02        }
工厂模式_设计模式_02    }
工厂模式_设计模式_02
工厂模式_设计模式_02    /// <summary>
工厂模式_设计模式_02    /// 素食面包
工厂模式_设计模式_02    /// </summary>
工厂模式_设计模式_02    public class ThailandVeggieBread : Bread
工厂模式_设计模式_02    {
工厂模式_设计模式_02       public ThailandVeggieBread()
工厂模式_设计模式_02        {
工厂模式_设计模式_02            Console.WriteLine("泰国素食面包");
工厂模式_设计模式_02        }
工厂模式_设计模式_02    }
工厂模式_设计模式_02
工厂模式_设计模式_02    /// <summary>
工厂模式_设计模式_02    /// 素食面包
工厂模式_设计模式_02    /// </summary>
工厂模式_设计模式_02    public class ChinaVeggieBread : Bread
工厂模式_设计模式_02    {
工厂模式_设计模式_02        public ChinaVeggieBread()
工厂模式_设计模式_02        {
工厂模式_设计模式_02            Console.WriteLine("中国素食面包");
工厂模式_设计模式_02        }
工厂模式_设计模式_02    }
工厂模式_设计模式_02
工厂模式_设计模式_02    #endregion
工厂模式_设计模式_02
工厂模式_设计模式_02}