• 创建型设计模式


    一、创建型模式解决的问题和实现方式 

    创建型模式要解决的主要问题就是类的使用者和类实例的创建(new 操作)之间的耦合关系。就是说如何让类的使用者,在代码中不用去直接new一个对象。这样,在被使用的类需要变化时,使用者的代码不需要变化或者只需要做很小的变化。这里说的类的变化,是有条件的,比如从A变到B,它们之间需要有共同的抽象才行,用代码来说——他们要有共同的接口。任何问题领域,一定有东西是在变化的,也一定有东西是稳定的。我们要做的就是把稳定的东西和变化的东西分开,让变化的部分的变化不会导致稳定的部分也需要变化,用接口来隔离变化。

    二、各个模式的解释 

    1、单件模式

    意图:保证一个类只有一个实例,并提供一个访问该实例的方式。下面是常见的实现代码: 

     1 Class DemoClass
     2 {
     3     private Object LockObj = new Object();
     4     private DemoClass instance;
     5     
     6     private DemoClass()
     7     { }
     8     
     9     public static DemoClass GetInstance()
    10     {
    11         if(instance == null)
    12         {
    13             lock(LockObj)
    14             {
    15                 if(instance == null)
    16                 {
    17                     instance = new DemoClass();
    18                 }
    19             }
    20         }
    21         
    22         return instance;
    23     }
    24 }

    这里解释一下为什么在多线程环境下,需要第15行的这个是否为空的判断。 

    假设有两个线程A、B访问这段代码,并且实例还没有被创建过。

    1、刚开始instance为null,假设线程A、B同时执行到第13行。

    2、此时A线程获得CPU时间开始往下执行,B线程则在这里等待。 

    3、A线程一路往下执行,创建好instance,并返回,此时线程A结束,CPU时间交给线程B。

    4、由于线程A结束,线程B得到锁,不用再等了,往下执行第15行,因为此时instance已经被线程A创建了,如果这里没有是否为空的判断,那么instance将会被重新创建一次。 

    2、工厂方法模式

    意图:提供一个创建对象的接口,让类的实例化延迟到子类。

    分析:重点就在与这个创建对象的接口,它只有一个Create方法,这个方法的工作很简单,就是去new一个对象而已,只不过这个工作是让这个接口的子类去做的。客户代码依赖于这个接口(或者说依赖于这个Create方法)和具体产品的IProduct接口去工作。

    结构图如下: 

                          

    3、创建者模式

    意图:将一个复杂对象的构建过程和它的表示分离,使得同样的构建过程可以创建不同的表示。

    分析:这里的重点在于对象构建过程的稳定,也就是说创建一个对象的步骤是定下来的,但是各个具体步骤会不同。 解决方法就是把各个需要变化的步骤,抽象成一个接口,然后构建过程根据这个接口的实例去构建,而不用关心这些步骤的具体实现。

    结构图如下: 

                                   

    上面的这个Director其实可以不需要,对象的这个构建过程也可以放到客户代码里面去,这个无所谓。它的存在会让结构更松散一些而已。 

    4、抽象工厂模式

    意图:提供一个创建一系列相关或者相互依赖的对象的接口,而不用去关心它们的具体实现。

    分析:抽象工厂模式与工厂方法模式的使用的方法非常相似,都是提供一个创建对象的接口,让具体对象的创建延迟到这个接口的子类。不同的是,工厂方法创建的是一个对象,创建的是某种类型的单个对象。而抽象工厂创建的是一系列的对象,这些对象是有一定的关联或者依赖关系的,对于下图来说就是A1、B1、C1、D1(或者A2、B2、C2、D2)之间有一定的联系,这些对象是一组有关系的对象,各自不是完全孤立的。

    结构图如下: 

                               

    5、原型模式

    意图:通过原型实例指定创建对象的种类,然后通过拷贝原型对象来创建新的实例。

    分析:实现方式和结构都比较简单,就是通过复制对象去创建新的对象。

    结构图如下:

                        

  • 相关阅读:
    saltstack安装和配置
    puppet安装和配置
    mongodb使用
    mongdb安装
    redis数据类型
    redis安装
    memcached结合php以及memcache共享session
    yum安装的Apache的各种配置文件的位置
    memcached 基本操作
    memcached基本操作和语法
  • 原文地址:https://www.cnblogs.com/JeffreySun/p/1619120.html
Copyright © 2020-2023  润新知