zoukankan      html  css  js  c++  java
  • 设计模式 之 简单工厂与工厂方法

        近期開始学习《大话设计模式》,作者以通俗的方式来解说,还有故事情节,幽默的对白,给人耳目一新的感觉。很喜欢作者的这样的步步深入,循循善诱的方式。学习了就要总结,总结的时候自己也学着作者的方式,以自己生活中的小样例来实现我们的设计模式。

    以下就開始我们的第一讲《简单工厂和工厂方法》。


        前两天带着一个老乡去吃饭。当然,作为一个四川人。去外边吃饭当然是点我们著名的川菜!以下先用简单工厂来实现一下:


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    
    namespace 简单工厂
    {
        //抽象产品类
        public abstract class  food
        {
            public abstract void Show();
        }
        //详细产品类型
        public class huiguorou:food 
        {
            public override void Show()
            {
                Console.WriteLine("来咯。回锅肉一份!

    "); } } public class mapodoufu:food { public override void Show() { Console.WriteLine("来咯,麻婆豆腐一份!

    "); } } public class shuizhuroupian:food { public override void Show() { Console.WriteLine("来咯,水煮肉片一份!

    "); } } public class yuxiangrousi:food { public override void Show() { Console.WriteLine("来咯,鱼香肉丝一份!"); } } //简单工厂 public class foodFacoty { public static food CreateFood(string Name) { food Food = null; switch (Name) { case "回锅肉": Food = new huiguorou(); break; case "麻婆豆腐": Food = new mapodoufu(); break; case "水煮肉片": Food = new shuizhuroupian(); break; case "鱼香肉丝": Food = new yuxiangrousi(); break; } return Food; } } class Program { static void Main(string[] args) { Console.WriteLine("老板,给我们来份回锅肉。"); Console.WriteLine("再来一份水煮肉片!"); food Food1 = foodFacoty.CreateFood("回锅肉"); Food1.Show(); food Food2 = foodFacoty.CreateFood("水煮肉片"); Food2.Show(); } } }




    简单工厂的类图:

                                                                        



    简单工厂的长处
        1.通过IProduct隔离了客户程序与ConcreteProductA的依赖关系,在客户程序视野内根本就没有ConcreteProductA。
        2.即使ConcreteProductA添加、删除方法或属性,也无妨大局,仅仅要依照要求实现了IProduct就能够了,Client无须关心ConcreteProductA的变化。
        3.相对直接写个ConcreteProductA而言。要平白地多写一个工厂出来,尤其须要IProduct频繁变化的时候,客户程序也闲不下来。



    简单工厂的局限性
        简单工厂比較优雅的攻克了外部new()的问题,它把目标实例的创建工作交给外部的工厂完毕,是设计模式化思想一个非常不错的引子。但假设应用中须要工厂的类型仅仅有一个,并且工厂的职责又非常单纯——就是一个new()的替代品,类似我们面向对象中普遍的思路,这时候就须要进一步抽象了,于是出现了新的发展:工厂方法模式和抽象工厂模式。

    接下来我们就用工厂方法来改进一下上面的代码,利用工厂方法,我们就不须要上面的简单工厂类,而是创建一个抽象工厂,这个抽象工厂有一个生产食物的方法。然后再用详细的工厂继承抽象工厂,并实现产生不同食物的方法。

    最后我们的client代码也就不一样了。


    //抽象工厂
        public abstract class FoodFactory
        {
            public abstract food CreateFood();
        }
        //详细工厂
        public class huiguorouFactory : FoodFactory
        {
            public override food CreateFood()
            {
                return new huiguorou();
            }
        }
        public class mapodoufuFactory : FoodFactory
        {
            public override food CreateFood()
            {
                return new mapodoufu();
            }
        }
        public class shuizhuroupianFactory : FoodFactory
        {
            public override food CreateFood()
            {
                return new shuizhuroupian();
            }
        }
        public class yuxiangrousiFactory : FoodFactory
        {
            public override food CreateFood()
            {
                return new yuxiangrousi();
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("老板。给我们来份回锅肉。");
                Console.WriteLine("再来一份鱼香肉丝");
                FoodFactory factory1 = new huiguorouFactory();
                food Food1 = factory1.CreateFood();
                Food1.Show();
                FoodFactory factory2 = new yuxiangrousiFactory();
                food Food2 = factory2.CreateFood();
                Food2.Show();
                
            }
        }


    工厂方法的类图:

                                                                             



    以下我们再来看看使用工厂方法模式的场合:
        1.当子类型可能会有非常多,以后须要不但增添不同的子类实现时;
        2.当一个系统尚在框架设计阶段,还不知道将来须要实例化哪些详细类时。

        3.系统设计之初不须要详细对象的概念(或者说没有详细对象的概念);


        简单工厂模式的最大长处在于工厂类中包括了必要的逻辑推断,依据client的选择条件动态实例化相关的类,对于client来说,去除了与详细产品的依赖。但问题也就在这里。假设要求加另外一个产品,我们就须要在简单工厂类的方法里加‘Case’的分支条件。改动原有的类。

    这就违背了开放-封闭原则。工厂方法模式是将工厂类抽象出一个接口(或一个抽象类)。

    然后全部要生产详细类的工厂,去实现这个接口(或继承这个抽象类)。这样。一个简单工厂模式的工厂类,变成了一个工厂抽象接口(或抽象类)和多个详细生成对象的工厂。


        工厂方法模式克服了简单工厂违背开放-封闭原则的缺点,它们都是几种封装了对象的创建,使得要更换对象时,不须要做大的修改就可实现,减少客户程序与产品对象的耦合。








  • 相关阅读:
    【11】 Java基础 <十一> —— equals的重写
    【10】 Java基础 <十> —— 用个人方法实现构造器的排序
    【9】 Java基础<九> —— 构造器的重载
    【8】 Java基础 <八> —— 方法的重载
    【7】 Java基础 <七> —— 自动装箱 自动拆箱
    【6】 Java基础 <六> —— super关键字
    Linux ssh下实现免密码登录(转载)
    Centos7 安装配置python3虚拟环境 virtualenvwrapper(转载)
    Linux 安装python3.7.0
    TOMCAT 日志自动删除
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6944346.html
Copyright © 2011-2022 走看看