`
lobin
  • 浏览: 387671 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

单例模式

 

在面向对象编程实践中,类是面向对象编程语言中最核心的概念,通过类可以实例化该类对象,但有时我们希望类只能实例化一个且只有一个对象实例。

 

+------------------------------------------------------------------------+

|                                 Singleton                            |

|--------------------------------------------------------------------------|

|+[u]INSTANCE[/u]: Singleton = new Singleton()      |

|--------------------------------------------------------------------------|

|-Singleton()                                                          |

+------------------------------------------------------------------------+

 

 

 

+-----------------------------------------------------------------------+

|                                  Singleton                          |

|-------------------------------------------------------------------------|

|-[u]INSTANCE[/u]: Singleton = new Singleton()      |

|-------------------------------------------------------------------------|

|-Singleton()                                                        |

|+[u]instance[/u]()                                                |

+-----------------------------------------------------------------------+

 

+-----------------------------------------------------------------------+

|                                   Singleton                         |

+-----------------------------------------------------------------------+

|-[u]instance[/u]: Singleton                                    |

|-------------------------------------------------------------------------|

|-Singleton()                                                         |

|+[u]instance[/u]()                                                 |

+-----------------------------------------------------------------------+

在这里,instance方法判断instance是否初始化,如果没有,则初始化instance创建这个单例实例,否则,返回这个单例实例。为了保证创建的这个实例是单例的,instance方法必须保证是同步的,在Java中可以用synchronized修饰,或者,在方法内部:

public static Singleton instance() {

    synchronized(Singleton.class) {

        if (instance == null) {

            instance = new Singleton();

        }

    }

    return instance;

}

上面的这种实现,每次调用instance方法得到这个单例实例时,都需要进行同步。为了避免每次调用进行同步,这里引入了一种double-check的写法:

 

public static Singleton getInstance() { 

  if(singleton == null) { 

     synchronized(Singleton.class) { 

       if(singleton == null) { 

         singleton = new Singleton(); 

       } 

    } 

  } 

  return singleton; 

}

这种double-check写法需要解决一个问题。在这里,singleton = new Singleton();这一行,Java实例化并不是一个原子操作,在实例化的时候,实际上包括new-assign-construct这3部操作。在上面的实现中,如果一个线程在调用getInstance方法时,如果还没有创建单例实例,则进去同步块中创建单例时,在assign之后construct调用构造方法完成之前,另一个线程也调用getInstance方法,此时singleton不为null,此时线程以为已经创建了单例实例,直接返回,到其实这个时候单例实例还没有创建完成。

 

为了解决这个问题,单例实例变量singleton应该定义为volatile变量。

 

在面向对象领域,这种设计模式似乎超出了我们对面向对象范畴的理解,在面向对象编程语言中,类是具有相同属性和行为的一组对象的抽象描述。我们定义一个类,就是为这些具有相同属性和行为的对象创建对应的具体实例。如果它本身就是特例,又为什么要为它定义这样一个类?

 

在一些面向对象高级语言(通常是一些高级编程语言,在这些编程语言中,通常混合支持多种编程语言范畴)中设计引入了一种叫“实例对象”的新特性,如scala的object:

object A {

...

}

scala中的object是对特定实例对象的描述。

 

所以在scala中,我们可以使用object来设计我们的单例,因为object描述的就是一个特定的实例。

+----------------------------------------------+

|                <Singleton>               |

+----------------------------------------------+

 

 

工厂模式

 

工厂类提供一个创建方法类封装产品的创建细节, 客户端不需要关注内部的产品的创建

 

1 简单工厂模式

 

特点 :

只有一种产品类

只有一个工厂类, 没有抽象和具体工厂之分

[img]http://dl.iteye.com/upload/attachment/213799/69bf3466-f30d-32e2-be53-7e1b9a28a11c.bmp[/img]

 

2 工厂方法模式

 

[img]http://dl.iteye.com/upload/attachment/213805/15c3e61e-a3d8-3472-a530-03317d0b6b7a.bmp[/img]

 

另一种: 

[img]http://dl.iteye.com/upload/attachment/221112/b4f59ef7-5705-36d9-a4e6-d35f26658fdb.bmp[/img]

 

3. 抽象工厂模式

 

Builder建造者模式

 

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。和工厂模式类似, 建造者模式封装了复杂对象的内部构造细节, 对象是如何构造出来的对于客户来说不需要去关心。

 

[img]http://dl2.iteye.com/upload/attachment/0131/6125/a23be831-b35a-3a24-8b18-d7f3332eef13.bmp[/img]

 

 

 

装饰模式  对象结构型模式

角色:  真实对象(角色)

装饰对象(角色)

装饰对象和真实对象的共同接口(角色)

客户端对象(角色)

定义:  在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

 

 

装饰模式的特点;

(1) 装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。

(2) 装饰对象包含一个真实对象, 以便对真实对象功能的代理;

(3) 装饰对象接受所有的来自客户端的请求。它把这些请求转发给真实的对象,同时对真实对象功能进行增强。

(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

 

下表格列举了装饰模式和继承的不同:

 

 

装饰模式 VS 继承

装饰模式 继承

用来扩展特定对象的功能 用来扩展一类对象的功能

不需要子类 需要子类

动态地 静态地

运行时分配职责 编译时分派职责

防止由于子类而导致的复杂和混乱 导致很多子类产生,在一些场合,报漏类的层次

更多的灵活性 缺乏灵活性

对于一个给定的对象,同时可能有不同的装饰对象,客户端可以通过它的需要选择合适的装饰对象发送消息。 对于所有可能的联合,客户期望

很容易增加任何的 困难 

 

类图

 

[img]http://dl2.iteye.com/upload/attachment/0131/6098/3f563391-89d2-3564-83d9-686364cb8d25.bmp[/img]

 

策略模式 

 

抽象策略类

一组具体策略类

上下文场景

客户端类

 

[img]http://dl2.iteye.com/upload/attachment/0131/6212/5493e4a1-4e63-3388-b016-8d300bff61ff.bmp[/img]

 

设计模式:Java C++ OO实践参考另一篇文章:https://lobin.iteye.com/blog/2441435

  • 大小: 3.2 KB
  • 大小: 7.5 KB
  • 大小: 6 KB
  • 大小: 6.4 KB
  • 大小: 13.8 KB
  • 大小: 6.5 KB
0
0
分享到:
评论

相关推荐

    Java 经典设计模式讲解以及项目实战

    Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...

    基于Java的设计模式大作业绘图系统【六种设计模式+文档】.zip

    本系统基于六种设计模式,运用到的设计模式有备忘录模式,简单工厂模式,迭代器模式,状态模式,模版方法模式,单例模式。 具体实现过程、UML类图以及实现效果详见如下项目说明地址: ... 该系统为绘图系统,该系统通过...

    设计模式精解- GoF 23种设计模式解析附C++实现源码

    设计模式精解- GoF 23种设计模式解析附C++实现源码 懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要。反之好像也可能成立。道可道,非常道。道不远人,设计模式亦然如此。 一直想把自己的学习经验以及在...

    C_设计模式(23种设计模式)

    C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计...

    23种设计模式经典案例(C++版)

    设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代 码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计...

    Java设计模式 设计模式介绍

    章节介绍:1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之...

    深入浅出设计模式 完整扫描版

    《深入浅出设计模式》总结了许多系统软件在设计开发过程中的难点,力图将设计模式的实际应用与实现原理有机结合起来,破解软件开发人员在学习设计模式过程不能透彻理解并灵活运用设计模式的难题。  所有章节都是先...

    设计模式:可复用面向对象软件的基础--详细书签版

     “[设计模式]在实用环境下特别有用,因为它分类描述了一组设计良好,表达清楚的面向对象软件设计模式。整个设计模式领域还很新,本书的四位作者也许已占据了这个领域造诣最深的专家中的半数,因而他们定义模式的方法...

    java 23种设计模式.zip

    设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:...

    Android源码设计模式解析与实战.pdf

    《Android 源码设计模式解析与实战》不仅分析了Android源代码的设计模式,更结合实例演示了如何使用这些设计模式。看这本书,既能学到如何分析、学习Android源代码,又能提高自己架构设计水平 《Android 源码设计...

    设计模式中文版

    尽管该书涉及较多的内容,但书中讨论的设计模式仅仅包含了一个设计行家所知道的部 分。书中没有讨论与并发或分布式或实时程序设计有关的模式,也没有收录面向特定应用领 域的模式。本书并不准备告诉你怎样构造用户界面...

    C++ Qt设计模式源代码

    书是美国萨福克大学已使用十余年的经典教程,利用跨平台开源软件开发框架Qt阐释了C++和设计模式中的主要思想。全书共分四个部分:第一部分介绍C++、UML、Qt、模型-视图、SQL、XML、设计模式等基础知识,目的是为零...

    java常用23中设计模式

    总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...

    设计模式课程设计---使用6个不同的设计模式完成绘图系统(java)

    运用到的设计模式有备忘录模式,迭代器模式,简单工厂模式,状态模式,模版方法模式,单例模式。 资源包含项目文件(eclipse)以及系统说明(docx文件),系统说明中说明了为什么要使用该模式,使用该模式有什么好处...

    24种设计模式以及混合设计模式

    24中设计模式 混合设计模式 设计模式实际应用案例 费了很多时间和精力整理的

    C#设计模式_C#设计模式_

    C# 设计模式.pdf 文档。无论您是新手,还是老手,本教程都值得一读。对于那些具有丰富的开发经验的开发人员,学习设计模式有助于了解在软件开发过程中所面临的问题的最佳解决方案;对于那些经验不足的开发人员,学习...

    研磨设计模式带书签完整版228M.7z.002

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    设计模式解析(第二版)

    阅读本书,读者能够完整地理解12个核心的设计模式和1个分析模式,了解设计模式并不是孤立存在的,多个设计模式协同工作才能创建出更加坚固的应用程序。这里所讲授的12个模式并没有涵盖所有应该学会的模式,但是理解...

    研磨设计模式带书签完整版228M.7z.001

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式(完整带书签).part2.pdf

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

Global site tag (gtag.js) - Google Analytics