工厂模式(Factory Pattern)

工厂模式:通过让子类决定该穿件的对象是什么,来达到将对象创建的过程封装的目的。


//抽象的产品

    //工厂所生产的产品"披萨"  
    public abstract class Pizza
    {
        protected string name;
        //产品生产工序 
        public virtual void prepare()
        {
            Console.WriteLine("准备“{0}”的馅料", name);
        }

        public virtual void bake()
        {
            Console.WriteLine("350度分钟烤25分钟 ");
        }

        public virtual void cut()
        {
            Console.WriteLine("将比萨饼切成斜片");
        }

        public virtual void box()
        {
            Console.WriteLine("将披萨装入地方特色的盒子中");
        }

        public string getName()
        {
            return name;
        }
    }

//具体的产品

    public class ChicagoStyleCheesePizza:Pizza
    {
        public ChicagoStyleCheesePizza()
        {
            base.name = "芝加哥起司披萨";
        }
    }

    public class NYStyleCheesePizza : Pizza
    {
        public NYStyleCheesePizza()
        {
            base.name = "纽约起司披萨";
        }
    }
//抽象的工厂
    //抽象的披萨工厂
    public abstract class PizzaStore
    {
        public Pizza orderPizza(string type)
        {
            Pizza pizza;
            pizza = createPizza(type);
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
            return pizza;
        }
        //创建披萨的抽象方法,在子类中实现
        public abstract Pizza createPizza(string item);
    }
//具体的工厂

    //芝加哥工厂
    public class ChicagoStore:PizzaStore
    {
        public override Pizza createPizza(string item)
        {
            if (item.ToUpper().Equals("CHEESE"))
            {
                return new ChicagoStyleCheesePizza();
            }
            else
            {
                return null;
            }
        }
    }

    //纽约工厂
    public class NYPizzaStore:PizzaStore
    {
        public override Pizza createPizza(string item)
        {
            if (item.ToUpper().Equals("CHEESE"))
            {
                return new NYStyleCheesePizza();
            }
            else
            {
                return null; 
            }
        }
    }

//测试用例

    class Program
    {
        static void Main(string[] args)
        {
            PizzaStore pizzaStore;
            List<PizzaStore> pizzaStoreList = new List<PizzaStore>();
            pizzaStoreList.Add(new NYPizzaStore());
            pizzaStoreList.Add(new ChicagoStore());
            while (true)
            {
                Console.WriteLine("请选择披萨商店:");
                for (int i = 0; i < pizzaStoreList.Count; i++)
                {
                    Console.WriteLine("{0}:{1}", i + 1, pizzaStoreList[i].GetType().Name);
                }
                if (!selectStore(pizzaStoreList, out pizzaStore))
                {
                    continue;
                }
                Console.WriteLine("请选择披萨口味:");
                Pizza pizza = selectPizza(pizzaStore);
                Console.WriteLine("您成功订购了披萨:{0}", pizza.getName());
                Console.Write("输入1继续订购,其他则退出,回车确认:");
                if (Console.ReadLine().Equals("1"))
                {
                    continue;
                }
                else
                {
                    break;
                }
            }
        }
		
		        Pizza selectPizza(PizzaStore pizzaStore)
        {         
            while (true)
            {
                Console.WriteLine("1:Cheese");
                Console.Write("请输入编号,按回车键确认:");
                string pizzaNum = Console.ReadLine();
                if (pizzaNum.Equals("1"))
                {
                    return pizzaStore.orderPizza("Cheese");
                }
                else
                {
                    Console.WriteLine("输入有误,请重新输入编号!");
                }
            }
        }


        bool selectStore(List<PizzaStore> pizzaStoreList, out PizzaStore pizzaStore)
        {
            pizzaStore = null;
            int num = 0;
            while (true)
            {
                Console.Write("请输入编号,按回车键确认,输入0回到商店选择:");
                try
                {
                    num = Convert.ToInt32(Console.ReadLine());
                    if (num == 0)
                    {
                        return false;
                    }
                    pizzaStore = pizzaStoreList[num - 1];
                    return true;
                }
                catch (Exception e)
                {
                    Console.WriteLine("请输入编号有误,错误原因({0})", e.Message);
                }               
            }
        }
    }
测试结果:



延展:

依赖倒置原则:要依赖抽象,不要依赖具体类。

这个原则听起来很像是“针对接口编程,不针对实现编程”,然后这里更强调“抽象”。这个原则说明了:不能让高层组件依赖低层组件,而且,不管高层或低层组件,“两者”都应该依赖于抽象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值