三十一.设计模式总结创建型模式

设计模式总结

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

单一职责:

开放封闭原则:

里氏代换:

合成聚合复用:

迪米特:

一.创建型模式

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();

原文地址:https://www.cnblogs.com/yaoge/p/1815266.html