设计模式

Posted yebingluo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式相关的知识,希望对你有一定的参考价值。

一、常见的设计模式分类

设计模式可以根据创建型、结构型、行为型三种结构进行划分。

1.1  创建型

创建对象时,不再由我们直接实例化对象;而是根据特定场景,由程序来确定创建对象的方式,从而保证更大的性能、更好的架构优势。创建型模式主要有简单工厂模式(并不是23种设计模式之一)、工厂方法、抽象工厂模式单例模式、生成器模式和原型模式。

1.2  结构型

用于帮助将多个对象组织成更大的结构。结构型模式主要有适配器模式adapter、桥接模式bridge、组合器模式component、装饰器模式decorator、门面模式、亨元模式flyweight和代理模式proxy

1.3  行为型

用于帮助系统间各对象的通信,以及如何控制复杂系统中流程。行为型模式主要有命令模式command、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式state、策略模式、模板模式和访问者模式。

二、常用的设计模式讲解

 2.1 创建型:单例模式

      单例模式顾名思义是保证一个类只有一个实例,并且这个类自行实例化向整个系统提供。

UML图:

技术分享图片

下面提供几种单例模式的写法:

java设计模式之 单例模式

 

单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。

 

  单例模式有三个要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。 
  单例模式是结构最简单的设计模式一,在它的核心结构中只包含一个被称为单例类的特殊类。 
技术分享图片

 

单例模式结构图中只包含一个单例角色: 
  Singleton(单例):在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()工厂方法,让客户可以访问它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有;在单例类内部定义了一个Singleton类型的静态对象,作为外部共享的唯一实例。

 

单例模式是一种比较常见的设计模式。

  单例模式作用:

  1.控制资源的使用,通过线程同步来控制资源的并发访问;

  2.控制实例产生的数量,达到节约资源的目的。

  3.作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。

单例模式适用场景

在以下情况下可以考虑使用单例模式: 
  (1) 系统只需要一个实例对象,如系统要求提供一个唯一的序列号生成器或资源管理器,或者需要考虑资源消耗太大而只允许创建一个对象。 
  (2) 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。

单例模式优缺点

主要优点:

  A.提供了对唯一实例的受控访问。

  B.由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。

  C.允许可变数目的实例。

主要缺点:

  A.由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。

  B.单例类的职责过重,在一定程度上违背了“单一职责原则”。

  C.滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。

单例模式的七种书写方式

第一种:懒汉,线程不安全

public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
      return instance;  
    }  
}

第二种:懒汉,线程安全,效率不高

public class Singleton {  
    private static Singleton instance;  

    private Singleton (){}  

    public static synchronized Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
      return instance;  
    }  

}

第三种:双重校验,提高效率

public class Singleton {  
    private volatile static Singleton singleton;  

    private Singleton (){}  

    public static Singleton getSingleton() {  
      if (singleton == null) {  
            synchronized (Singleton.class) {  
         if (singleton == null) {  
            singleton = new Singleton();  
          }  
        }  
    }  
      return singleton;  
    }  

}

第四种:饿汉

public class Singleton {  
    private static Singleton instance = new Singleton();  

    private Singleton (){}  

    public static Singleton getInstance() {  
      return instance;  
    }  

}

第五种:饿汉,变种

public class Singleton {  
    private  Singleton instance = null;  

   static{
       instance = new Singleton();
      }
    private Singleton (){}  

    public static Singleton getInstance() {  
      return instance;  
    }  

}

 

2.2 创建型:工厂方法

 

 2.3 结构型:适配器模式

 

 2.4 结构型:代理模式

 

 2.5 行为型:观察者模式

 

 2.6 行为型:策略模式






以上是关于设计模式的主要内容,如果未能解决你的问题,请参考以下文章

十条实用的jQuery代码片段

尝试使用片段保存夜间模式状态

如何更改谷歌地图标记上方的标题和片段设计

炫酷 CSS 背景效果的 10 个代码片段

添加片段时的 FlyOut 菜单设计问题

高效Web开发的10个jQuery代码片段