zoukankan      html  css  js  c++  java
  • 三十一.设计模式总结创建型模式

    设计模式总结

    依赖倒转原则:抽象不应该依赖细节,细节应该依赖于抽象

    单一职责:

    开放封闭原则:

    里氏代换:

    合成聚合复用:

    迪米特:

    一.创建型模式

    1,简单工厂,工厂,抽象工厂            区别

    简单工厂工厂根据传入的字段,在switch里判断并返回一个相应的实例。

            优点:将判断选择放入工厂中,客户端不必判断

            缺点:不符合开放-封闭原则的精神

            总结:操作方法稳定时,要除去客户端依赖时使用

    可以结合反射使用,或者结合策略模式使用

    Class Factory

    {

            Public static 基类 Set子类(string str)

            {     基类 f=null;

                   Switch(str)

                   {case “” f=new 子类1();break;

    ……}

                   Return f;

    }

    }

           工厂模式:每一种操作类,就有一个继承工厂接口的类,返回相应的操作。

                  优点:没有判断语句,符合开放-封闭原则

                  缺点:客户端必须实例化相应的操作工厂,增加了依赖

                  总结:有与客户端的依赖,但子类个数不稳定时使用

                  InterfaceIFactory(){基类 create子类();}

                  Class子类1Factory:IFactory

                  {

                  Public基类 create子类(){return new 子类1();}

    }

    Class 子类1Factory:IFactory

                  {

                  Public基类 create子类(){return new 子类1();}

    }

           抽象工厂原型于工厂模式,但是他能提供一组相应的操作类

                  优点:同工厂模式,但能提供一组相应的类。

                  缺点:工厂部分更加复杂,变动更加困难

                  总结:利用工厂模式,提供一组组相应的类,无需指定他们具体的类。

                           常用于数据库更换等类似的场景。

    可以结合简单工厂改进抽象工厂,将判断工厂类型放到switch中

                  interface  IFactory//抽象工厂接口,包含所有产品创建的抽象方法

               {

           IUser CreateUser();

           IAdmin CreateAdmin();

               }

               class SqlServerFactory : IFactory//具体工厂

               {

                  public IUserCreateUser(){return new SqlServerUser();}

           public IAdmin CreateAdmin(){return new SqlServerAdmin();}

               }

               class AccessFactory : IFactory

               {

           public IUser CreateUser(){return new AccessUser();}

           public IAdmin CreateAdmin(){return new AccessAdmin();}

               }

    2,单例模式

    保证一个类仅有一个实例,并提供一个访问它的全局访问点,类自身负责保证保存它的唯一实例。

    优点:保证只有一个实例,保证数据一直和减少空间占用

    缺点:在多线程中应用时要注意

    总结:私有化构造函数,使其只能自身实例化,保证唯一性

    Class child

    {

    private static child c;

           private child() { }

           public static child GetChild()

           {

               if (c == null) {c = new child();}

               return c;

           }

    }

    多线程下:加锁或双重锁

    private static readonly object syncRoot = new object();//锁

    public staticchild GetChild()

    {     //if(c==null){双重锁

           Lock(syncRoot){

               if (c == null) {c = new child();}

               return c;

                  }

        }

           或公共静态类(不推荐)

           Sealed class child//密封的

    { private static readonly child c=new child();//第一次引用类的任何成员时创建实例。

    公共语言运行库负责处理变量初始化

           private child() { }

           public static child GetChild()

           {

               returnc;

           }

    3,建造者模式

           将一个复杂对象的构建与它的表示分离,算法独立于组成及装配方式

           优点:由指挥类调用传入的建造者类的相关方法。高内聚内部建造过程

           总结:用于创建一些复杂的对像,内部创建顺序稳定但复杂变化的。

           classDirector//控制类

        {

           private F f;

           public Director(F f)

           {this.f = f; }

           public void createF()

           {f.f1();f.f2();f.f3();}

        }

       abstract class F//建造者抽象类

        {

           public abstract void f1();

           public abstract void f2();

           public abstract void f3();

        }

    4,原型模式

           用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象

           优点:在A a=new A();A b=a;是传引用而不是传值引用。原型模式可以克服这一问题。

           缺点:拷贝,深拷贝,拷贝程度非常麻烦

           总结:实现浅克隆,复制值类型,复制引用,但不复制引用对象。使用时要注意。

                  publicoverride Prototype Clone()

           {

               return (Prototype)this.MemberwiseClone();

           }

           使用:

           ConcretePrototypelp1 = new ConcretePrototypel("i");

       ConcretePrototypel c1 = (ConcretePrototypel)p1.Clone();

  • 相关阅读:
    python--数据可视化
    python--数据处理与探索
    如何使用.NET开发全版本支持的Outlook插件产品(四)——进阶探讨
    如何使用.NET开发全版本支持的Outlook插件产品(三)——全面控制
    对于.NET Socket连接的细节记录
    如何使用.NET开发全版本支持的Outlook插件产品(二)——完善插件
    如何使用.NET开发全版本支持的Outlook插件产品(一)——准备工作
    不建议双挖
    不要挖门罗
    关于PoW工作量证明的不公平
  • 原文地址:https://www.cnblogs.com/yaoge/p/1815266.html
Copyright © 2011-2022 走看看