单例模式
在面向对象编程实践中,类是面向对象编程语言中最核心的概念,通过类可以实例化该类对象,但有时我们希望类只能实例化一个且只有一个对象实例。
+------------------------------------------------------------------------+
| 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]
相关推荐
设计模式 的分类 总体来说设计模式分为三大类: 创建型模式(5): 工厂方法模式 、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式(7): 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、...
C# 设计模式.pdf 文档。无论您是新手,还是老手,本教程都值得一读。对于那些具有丰富的开发经验的开发人员,学习设计模式有助于了解在软件开发过程中所面临的问题的最佳解决方案;对于那些经验不足的开发人员,学习...
在编程领域,设计模式是解决常见问题的经过验证的、可重用的解决方案。它们是经验丰富的软件开发者在长期实践中总结出来的智慧结晶,为解决特定情境下的设计问题提供了指导。在Java开发中,掌握设计模式对于提升代码...
人人都懂设计模式 设计模式是软件开发中的一种解决方案,它提供了一种通用的设计思想和方法论,可以帮助开发者更好地设计和实现软件系统。设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。 在本书中...
项目开发中发现问题、解决问题这个过程中有很...如果设计模式在编码设计生涯中用得极少,主要原因是对设计模式的理解还不够,认识不到问题的存在。 因为不能正确的分析问题、认识问题,当然也不可能很好的解决问题了。
"设计模式" 在软件开发中,设计模式是一种解决特定问题的通用方法。它可以帮助开发者编写更加灵活、可维护、可扩展的代码。本书《您的设计模式》对设计模式进行了详细的讲解,涵盖了策略模式、代理模式、单例模式、...
大话设计模式 完整设计模式介绍
Java设计模式面试题汇总 本文将对Java设计模式面试题进行总结,涵盖软件设计原则、设计模式的定义、分类、常见模式等内容。 软件设计原则: 软件设计原则是指在软件设计中需要遵守的一些规则和原则,这些原则可以...
使用5种设计模式完成的一个点单系统,显示不同系列下的所有商品,点击选择冰度甜度之后添加到订单中,计算总金额,下单之后发送订单到门店的后厨制作商品。使用了抽象工厂模式、装饰模式、单例模式、代理模式、原型...
Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...
设计模式之《大话设计模式》.pptx
本系统基于六种设计模式,运用到的设计模式有备忘录模式,简单工厂模式,迭代器模式,状态模式,模版方法模式,单例模式。 具体实现过程、UML类图以及实现效果详见如下项目说明地址: ... 该系统为绘图系统,该系统通过...
设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的经验总结。这些模式在不同的场景下被反复验证并被广泛接受,为开发者提供了一种标准的、可复用的解决方案。在这个“设计模式之美”的学习笔记...
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。刘伟先生在讲解设计模式时,通常会深入浅出地介绍这些模式的原理、应用场景以及如何有效地在实际编程中应用它们。设计模式并不是...
在软件开发领域,设计模式和体系结构是两个至关重要的概念,尤其在大型项目中,它们对于软件的可维护性、可扩展性和可复用性起着决定性的作用。本项目——“服装管理系统”是一个很好的实践案例,让我们深入探讨其中...
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的经验总结,为软件开发提供了可复用的解决方案。这份“设计模式手册”CHM版,旨在为开发者提供一个方便快捷的参考资料,以便在实际项目开发...
设计模式是软件开发中的经典实践,它们为解决特定问题提供了通用、可复用的解决方案。在Java编程中,运用合适的设计模式可以提高代码的可维护性、可扩展性和可复用性。以下是关于Java版本设计模式实现demo的一些补充...
在计算机科学领域,设计模式是软件工程中用于解决特定问题的一般性方案,它们是经过实践检验的最佳实践。这些模式被广泛应用于面向对象软件设计中,能够提高代码的可重用性、灵活性和可维护性。设计模式通常被划分为...
设计模式是一种被广泛认可的解决软件设计问题的方法,它在软件工程领域内尤为重要。设计模式的基本思想是通过总结和抽象软件开发中反复出现的问题以及这些问题的解决方案,形成一种通用的设计概念。这种概念不仅可以...
设计模式精解- GoF 23种设计模式解析附C++实现源码 懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要。反之好像也可能成立。道可道,非常道。道不远人,设计模式亦然如此。 一直想把自己的学习经验以及在...