当前位置:文档之家› 单例模式

单例模式

单例模式
单例模式

全局变量是面向对象程序员遇到的引发bug的主要原因之一。这是因为全局变量将类捆绑于特定的环境,破坏了封装(参见第6章及第8章)。尽管这并不是我们想要的,但全局变量不受保护的本质的确是个很大的问题。一旦开始依赖全局变量,那么某个类库中声明的全局变量和其他地方声明的全局变量迟早会发生冲突。

几个关键点:

1.Preferences对象应该可以被系统中的任何对象使用。

2.Preferences对象不应该被储存在会被覆写的全局变量中。

3.系统中不应超过一个Preferences对象。

我们可以使用静态方法和静态属性来间接实例化对象。

单例模式第一种方法

class Preferences {

private $props=array();

private static $instance;

private function __construct() {}

public static function getInstance() { //如果这里不用static下面无法用::使用它,安装规则只能用new,可是这里new只能在内部,不能在外边

if(empty(self::$instance)) {

self::$instance=new Preferences();

}

return self::$instance;

}

public function setProperty($key,$val) {

$this->props[$key]=$val;

}

public function getProperty($key) {

return $this->props[$key];

}

}

$pref=Preferences::getInstance();

$pref->setProperty("name","matt");

unset($pref);//移除引用

$pref2=Preferences::getInstance();

print $pref2->getProperty("name")."\n";//该属性值并没有丢失为matt

print $pref->getProperty("name")."\n";//这里因为上面已经删除引用所以报错,因为不存在该对象

$pref3=Preferences::getInstance();

$pref3->setProperty("name","matt3");

print $pref2->getProperty("name")."\n"; //matt3

更完整版:

class test {

//保存类实例的私有静态成员变量

private static $_instance;

//定义一个私有的构造函数,确保单例类不能通过new关键字实例化,只能被其自身实例化private function __construct() {

echo 'test __construct';

}

//定义私有的__clone()方法,确保单例类不能被复制或克隆private function __clone() {}

public static function getInstance() {

//检测类是否被实例化

if ( ! (self::$_instance instanceof self) ) {

self::$_instance = new test();

}

return self::$_instance;

}

}

//调用单例类

test::getInstance();

require_once("DB.php");

class DatabaseConnection

{

public static function get() //这里必须静态,道理同上{

static $db = null;

if ( $db == null )

$db = new DatabaseConnection();

return $db;

}

private $_handle = null;

private function __construct()

{

$dsn = 'mysql://root:password@localhost/photos';

$this->_handle =& DB::Connect( $dsn, array() );

}

public function handle()

{

return $this->_handle;

}

}

print( "Handle = ".DatabaseConnection::get()->handle()."\n" ); print( "Handle = ".DatabaseConnection::get()->handle()."\n" ); ?>

在两次调用间,handle 方法返回的数据库句柄是相同的,这就是最好的证明。您可以在命令行中运行代码来观察这一点。

Handle = Object id #3

Handle = Object id #3

第二种方法

class Teacher {

function sayHi() {

return "the teacher...";

}

static function getInstance() { //这里必须静态,道理同上

static $instance;

if(!isset($instance)) {

$c=__CLASS__;

$instance=new $c;

}

return $instance;

}

}

echo Teacher::getInstance()->sayHi(); //the teacher...

?>

第三种方法

提供一个singleton类,然后通过调用getInstance方法,可以为任何一个类生产出一个实例来。

class singleton{

function Instance($class){

static $instances=array();

if(!array_key_exists($class,$instances)){

$instances[$class]=new $class;

}

$instance=$instances[$class];

return $instance;

}

}

class people{

function sayHi(){

return "Hello i am s people";

}

}

echo singleton::Instance('people')->sayHi();

结果:Hello i am s people

生产的是people的单例模式,跟前面两种实例化自己不同

主要优点:

1、提供了对唯一实例的受控访问。所以它可以严格控制客户怎样以及何时访问它。

2、由于在系统内存中只存在一个对象,因此可以节约系统资源,避免对共享资源的多重占用。对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。

3、允许可变数目的实例。基于单例模式我们可以进行扩展,使用与单例控制相似的方法来获得指定个数的对象实例,既节省系统资源,又解决了单例单例对象共享过多有损性能的问题。

4、使用单类模式,可以避免重复循环

5、可以全局访问

6、单例模式是为了解决多线程的安全的问题。在考虑到多线程的单例模式中,一来可以防止多线程带来的安全隐患,而来可以一定程度防止死锁的问题。

适用场景:由于单例模式的以上优点,所以是编程中用的比较多的一种设计模式。我总结了一下我所知道的适合使用单例模式的场景:

1.需要频繁实例化然后销毁的对象。

2.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。

3.有状态的工具类对象。

4.频繁访问数据库或文件的对象。

5.以及其他我没用过的所有要求只有一个对象的场景。

6.对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等

7.单例模式:有些东西只需要一个对象就可以了,比如工厂模式中的工厂。

主要缺点:

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

2、单例类的职责过重,在一定程度上违背了“单一职责原则”。因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创建和产品的本身的功能融合到一起。

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

5.不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。

单例模式使用场合

1.比如一个公厕,只有一个坑,这个时候大街上有好多个人想解决问题,但是只能一个个来,这个时候就有必要把“公厕”这个类设计成单实例的,确保统一时刻访问公厕的人只能有一个。

2.比如邮局里的电话簿只有一本,有需要的人拿来看,没有必要每个人要查的时候工作人员

就拿一本出来,看完了再回收。。。

3.比如说现在有一个txt文档,有很多很多内容。我们需要读取这个txt的内容,就需要解析txt文件。这个解析txt文档需要花费相当相当多的时间。要是每次使用,都来new一个对象,花上数十秒时间来解析这个txt文档,实在没必要。现在,我们使用单例,就只需要解析一次。把解析之后的txt文档,全放在一个对象里保存,然后把这个对象放到内存。这样每次要读取txt文档内容,只要直接使用那个单例对象就好。读取配置文件也就相当于读取txt 文档,一般都是使用单例来读写配置文档。

4.除此之外,单例的另一个应用,就是保障对象的唯一性。比如说,财务上有个“总账”,这个数据只能有一份。你要是有多个“总账”,每个“总账”的数据不相同,岂不是乱套了?怎么知道哪个是有效的?

有些对象在程序的整个生命周期里,它的确只能有一份实例,保证了数据的正确,这样用单例就比较好,防止多处被实例化,而单例模式是不允许用户去new的

至于跟静态类,没多少区别,主要看你怎么用了

单例模式和静态类区别

1.单例可以控制初始化静态类不可以

2.静态类面向过程

3.

.......问百度

所谓静态类指的是无需实例化成对象,直接通过静态方式调用的类。

class Math

{

public static function ceil($value)

{

return ceil($value);

}

public static function floor($value)

{

return floor($value);

}

}

?>

静态类的问题

本质上讲,静态类是面向过程的,因为通常它只是机械的把原本面向过程的代码集合到一起,虽然结果是以类的方式存在,但此时的类更像是一件皇帝的新衣,所以可以说静态类实际上是披着面向对象的壳儿,干着面向过程的事儿。

面向对象的设计原则之一:针对接口编程,而不是针对实现编程。这有什么不同?打个比方

来说:抛开价格因素,你喜欢独立显卡的电脑还是集成显卡的电脑?我想绝大多数人会选择独立显卡。独立显卡可以看做是针对接口编程,而集成显卡就就可以看做是针对实现编程。如此说来针对实现编程的弊端就跃然纸上了:它丧失了变化的可能性。

下面杜撰一个文章管理系统的例子来具体说明一下:

class Article

{

public function save()

{

ArticleDAO::save(); //只能用ArticleDAO类

}

}

?>

Article实现必要的领域逻辑,然后把数据持久化交给ArticleDAO去做,而ArticleDAO是一个静态类,就好像焊在主板上的集成显卡一样难以改变,假设我们为了测试代码可能需要Mock掉ArticleDAO的实现,但因为调用时使用的是静态类的名字,等同于已经绑定了具体的实现方式,Mock几乎不可能,当然,实际上有一些方法可以实现:

class Article

{

private static $dao = 'ArticleDAO';

public static funciton setDao($dao) //变成类的名称可改变

{

self::$dao = $dao;

}

public static function save()

{

$dao = self::$dao;

$dao::save();

}

}

?>

有了变量的介入,可以在运行时设定具体使用哪个静态类:

Article::setDao('MockArticleDAO');

Article::save();

?>

虽然这样的实现方式看似解决了Mock的问题,但是首先它修改的原有的代码,违反了开闭原则,其次它引入了静态变量,而静态变量是共享的状态,有可能会干扰其它代码的执行,所以并不是一个完美的解决方案。

对象的价值

如果放弃静态类,转而使用对象,应该如何实现文章管理系统的例子?代码如下:

class Article

{

private $dao;

public function __construct($dao = null)

{

if ($dao === null) {

$dao = new ArticleDAO();

}

$this->setDao($dao);

}

public function setDao($dao)

{

$this->dao = $dao;

}

public function save()

{

$this->dao->save();

}

}

?>

$article = new Article(new MockArticleDAO());

$article->save();

?>

对象有自己的状态,不会发生共享状态干扰其它代码的执行的情况。

当然,静态类有好的一面,比如说很适合实现一些无状态的工具类,但多数时候,我的主观倾向很明确,多用对象,少用静态类,避免系统过早的固化。顺便说一句,希望别有人告诉我静态类比对象快之类的说教,谢谢。

软件设计模式试题集 含答案

设计模式试题 一.选择 1. 设计模式具有的优点()。 A.适应需求变化 B.程序易于理解 C.减少开发过程中的代码开发工作量 D.简化软件系统的设计 2. 设计模式一般用来解决什么样的问题( )。 A.同一问题的不同表相 B 不同问题的同一表相 C.不同问题的不同表相 D.以上都不是 3. 设计模式的两大主题是( )。 A.系统的维护与开发 B.对象组合与类的继承 C.系统架构与系统开发 D.系统复用与系统扩展 4. 以下哪些问题通过应用设计模式不能够解决。() A)指定对象的接口B)针对接口编程 C)确定软件的功能都正确实现D)设计应支持变化 二.填空 1. 模式的基本要素包括名称、意图、问题、解决方案、参与者和协作者、(效果)、实现、GoF 参考。 2. 设计模式基本原则包括:开闭原则,(从场景进行设计的原则),包容变化原则。 3. 设计模式是一个(抽象)的方案,它可以解决一类问题。 4. 1. 在设计模式群体中,效果是指(原因和结果)。三. 判断 1. 适配器模式属于创建型模式。错 2. 在设计模式中,“效果”只是指“原因和结果”。对 3. 设计模式使代码编制不能真正工程化。错 4. 设计模式的两大主题是系统复用与系统扩展。对四. 名词解释 1. 设计模式 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 2. 模板 模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 3. 模式 就是解决某一类问题的方法论。把解决某类问题的方法总结归纳到理论高度,那就是模式。 4. 内聚度 模块内部各成分彼此结合的紧密程度。五.简答 题 1. 什么是设计模式?设计模式的目标是什么?设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验的总结。使用设计模式是为了可 重用代码、让代码更容易被他人理解、保证代码可靠性。 2. 设计模式的基本要素有哪些? 名称,意图,问题,解决方案,参与者和协作者,效果,实现,GOF 参考。 3. 设计模式中一般都遵循的原则有什么? 开-闭原则,根据场景进行设计原则,优先组合原则,包容变化原则。 4. 四人团针对“创建优秀面向对象设计”建议了哪些策略? 针对接口编程,优先使用对象组合而不是类继承,找到并封装变化点。 第6 章 facade(外观)模式 一.选择 1. 外观模式的作用是()。A.当不能采用生成子类的方法进行扩充时,动态地给一个对象添加一些 额外的功能。B.为了系统中的一组功能调用提供一个一致的接口,这个接口使得这一子系统更 加容易使用。

最新java设计模式考试题资料

1、设计模式一般用来解决什么样的问题( a) A.同一问题的不同表相 B不同问题的同一表相 C.不同问题的不同表相 D.以上都不是 2、下列属于面向对象基本原则的是( c ) A.继承 B.封装 C.里氏代换 D都不是 3、Open-Close原则的含义是一个软件实体( a ) A.应当对扩展开放,对修改关闭. B.应当对修改开放,对扩展关闭 C.应当对继承开放,对修改关闭 D.以上都不对 4、当我们想创建一个具体的对象而又不希望指定具体的类时,可以使用( a )模式。 A.创建型 B.结构型 C行为型 D.以上都可以 5、要依赖于抽象,不要依赖于具体。即针对接口编程,不要针对实现编程,是( d )的表述 A.开-闭原则 B.接口隔离原则 C.里氏代换原则 D.依赖倒转原则 6、依据设计模式思想,程序开发中应优先使用的是( a )关系实现复用。 A, 委派 B.继承 C创建 D.以上都不对 复用方式:继承和组合聚合(组合委派) 7、设计模式的两大主题是( d ) A.系统的维护与开发 B 对象组合与类的继承 C.系统架构与系统开发 D.系统复用与系统扩展 8、单子模式中,两个基本要点( a b )和单子类自己提供单例 A .构造函数私有 B.唯一实例 C.静态工厂方法 D.以上都不对 9、下列模式中,属于行为模式的是( b ) A.工厂模式 B观察者 C适配器以上都是 10、“不要和陌生人说话” 是( d )原则的通俗表述 A.接口隔离 B.里氏代换 C.依赖倒转 D.迪米特:一个对象应对其他对象尽可能少的了解 11、构造者的的退化模式是通过合并( c )角色完成退化的。 A.抽象产品 B产品 C创建者 D使用者

单例模式介绍

1 单例(Singleton)模式:单例模式确保某一个类只有一个实例,而且该类只能是自己实例化自己并向其他类公开这个实例的对象创 建模式 采用单例模式的类:根据单例模式知道其要满足以下三点 1. 确保某一个类只有一个实例 2. 而且自己实例化 3. 并向其他类提供这个实例类。 2 确保以上三点的所采用的编程策略 * 把构造方法声明为Private。确保只能由自己创建,避免外部创建实例或者被子类继承从而创造额外实例; * 定义一个私有静态的该类的实例作为该类的数据域。确保一个类只能有一个实例; *定义一个静态工厂方法。外部类不能实例化一个该类的对象,所以只能用Static 的方法,提供给其他类调用,返回此单例类唯一的实例。 3、使用单例模式的条件: 使用单例模式有一个必要条件:在一个系统要求一个类只有一个实例时才应当使用单例模式,反过来说,如果一个类可以有几个实例共存,那么就没有必要使用单例模式类。

4 单例在JAVA中的3种(一般形式)形式 主动式单例类: public class ActiveSingleton { private static final ActiveSingleton m_instance = new ActiveSingleton(); //在类加载的时候就实例化一个自己的对象 private ActiveSingleton() { } //每次调用该工厂方法返回该实例 public static ActiveSingleton getInstance() { return m_instance; } } java语言中单例类的一个最重要的特点是类的构造方法是私有的,从而避免外界利用构造子直接创建出任意多的实例。因为构造是私有的,因此此类不能被继承。主动式单例类在类加载的时候就实例化一个自己的对象。 被动式单例类: public class LazySingleton { private static LazySingleton m_instance = null; private LazySingleton() { }

软件设计模式(JAVA)习题答案

软件设计模式(Java版)习题 第1章软件设计模式基础 1.1 软件设计模式概述 1.2 UML中的类图 1.3 面向对象的设计原则 一、名词解释 1.一个软件实体应当对扩展开放,对修改关闭,即在不修改源代码的基础上扩展 一个系统的行为。 2.一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。 3.在软件中如果能够使用基类对象,那么一定能够使用其子类对象。 4.是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结, 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 二、单选择题 1.( A ) 2.( A ) 3. ( A ) 4. ( D ) 5. ( D ) 6.( A ) 7. ( D ) 8.( D ) 9.( D ) 10.( E ) 11.( C ) 12.( C ) 13. ( A ) 三、多选择题 1.( A、B、C、D ) 2. ( A、B ) 3.( A、D ) 4.( A、B、C、D ) 四、填空题 1.依赖倒转、迪米特法则、单一职责 2.模式名字、目的、问题、解决方案、效果、实例代码 3.超类、子类 4.开闭 5.用户 6.依赖倒转 7.组合/聚合 8.结构型、行为型 9.依赖倒转 10.开闭 11.需求收集是否正确、体系结构的构建是否合理、测试是否完全 12.人与人之间的交流 13.接口 14.名称、目的、解决方案 15.对象组合、类继承

16.对象组合 17.对象组合、类继承 18.抽象类的指针 五、简答题 1.答:设计模式按类型分为以下三类: 1)创建型设计模式:以灵活的方式创建对象集合,用于管理对象的创建。 2)结构型设计模式:将己有的代码集成到新的面向对象设计中,用于处理类或对象的组合。 3)行为型设计模式:用于描述对类或对象怎样交互和怎样分配职责。 2.答:设计模式的主要优点如下: 1)设计模式融合了众多专家的经验,并以一种标准的形式供广大开发人员所用,它提供了一套通用的设计词汇和一种通用的语言以方便开发人员之间沟通和交 流,使得设计方案更加通俗易懂。 2)设计模式使人们可以更加简单方便地复用成功的设计和体系结构,将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。设计模式使得重用成功的设计更加容易,并避免那些导致不可重用的设计方案。 3)设计模式使得设计方案更加灵活,且易于修改。 4)设计模式的使用将提高软件系统的开发效率和软件质量,且在一定程度上节约设计成本。 5)设计模式有助于初学者更深入地理解面向对象思想,一方面可以帮助初学者更加方便地阅读和学习现有类库与其他系统中的源代码,另一方面还可以提高软件的设计水平和代码质量。 3.答:设计模式一般有如下几个基本要素:模式名称、问题、目的、解决方案、效 果、实例代码和相关设计模式,其中的关键元素包括模式名称、问题、解决方案和效果。 4.答:正确使用设计模式具有以下优点: ⑴可以提高程序员的思维能力、编程能力和设计能力。 ⑵使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从 而缩短软件的开发周期。 ⑶使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。 5.答:根据类与类之间的耦合度从弱到强排列,UML中的类图有以下几种关系:依赖关 系、关联关系、聚合关系、组合关系、泛化关系和实现关系。其中泛化和实现的耦合度相等,它们是最强的。

java单例模式精解

Singleton模式可以是很简单的,它的全部只需要一个类就可以完成(看看这章可怜的UML图)。但是如果在“对象创建的次数以及何时被创建”这两点上较真起来,Singleton模式可以相当的复杂,比头五种模式加起来还复杂,譬如涉及到DCL双锁检测(double checked locking)的讨论、涉及到多个类加载器(ClassLoader)协同时、涉及到跨JVM(集群、远程EJB等)时、涉及到单例对象被销毁后重建等。对于复杂的情况,本章中会涉及到其中一些[1] 目的: 希望对象只创建一个实例,并且提供一个全局的访问点。 场景: Kerrigan对于Zerg来说是个至关重要的灵魂人物,无数的Drone、Zergling、Hydralisk……可以被创造、被牺牲,但是Kerrigan得存在关系到Zerg在这局游戏中的生存,而且Kerrigan是不允许被多次创造的,必须有且只有一个虫族刀锋女王的实例存在,这不是游戏规则,但这是个政治问题。 分析: 如前面一样,我们还是尝试使用代码来描述访问Kerrigan的过程,看看下面的UML图,简单得我都不怎么好意思放上来占版面。 图6.1 单例模式的UML图 结构是简单的,只是我们还有一些小小的要求如下:

1.最基本要求:每次从getInstance()都能返回一个且唯一的一个Kerrigan 对象。 2.稍微高一点的要求:Kerrigan很忙,很多人找,所以希望这个方法能适应多线程并发访问。 3.再提高一点的要求:Zerg是讲究公务员效率的社会,希望找Kerrigan的方法性能尽可能高。 4.最后一点要求是Kerrigan自己提出的:体谅到Kerrigan太累,希望多些睡觉时间,因此Kerrigan希望实现懒加载(Lazy Load),在需要的时候才被构造。 5.原本打算说还提要处理多ClassLoader、多JVM等情况,不过还是不要把情况考虑的太复杂了,暂且先放过作者吧(-_-#)。 我们第一次写的单例模式是下面这个样子的: Java代码 1./** 2. * 实现单例访问Kerrigan的第一次尝试 3. */ 4.public class SingletonKerriganA { 5. 6. /** 7. * 单例对象实例 8. */ 9. private static SingletonKerriganA instance = null; 10. 11. public static SingletonKerriganA getInstance() { 12. if (instance == null) { // line A 13. instance = new SingletonKerriganA(); //lin e B 14. } 15. return instance; 16. }

设备验收报告单模板(共9篇)

v1.0 可编辑可修改 篇一:设备验收报告格式 中铁物资平顶山铁路机械有限公司 设备验收报告 编码:编号:2013008 图片已关闭显示,点此查看 保存部门:生产技术部保存期限:长期年 篇二:设备验收报告样本 设备 验收报告 分类编号: 合同编号: 设备编号: 设备名称: 使用单位: 验收日期: 图片已关闭显示,点此查看 以上表格如未满足需要,请自行添加 图片已关闭显示,点此查看 图片已关闭显示,点此查看 图片已关闭显示,点此查看 图片已关闭显示,点此查看 图片已关闭显示,点此查看 图片已关闭显示,点此查看 图片已关闭显示,点此查看 篇三:设备验收报告模板3 设备验收报告 用户单位:供货单位:交货地点:交货日期: 图片已关闭显示,点此查看

图片已关闭显示,点此查看 用户单位盖章供货单位盖章 验收人签字:验收人签字: 验收日期:验收日期: 篇四:设备验收报告--模板 (需一式四份原件) xxx等设备验收报告 设备经费来源: 合同金额: 供货商: 一.实物清单及技术指标 图片已关闭显示,点此查看 二.验收记录 安装调试完毕后,对设备进行测试和实验的详细验收记录如下:设备a验收记录 1、操作步骤与方法 2、操作结果 设备b验收记录 1、操作步骤与方法 2、操作结果 …… (每类设备需单独给出验收记录) 三.验收结论: 通过上述测试和实验证明,xxx等设备数量与合同一致,且性能良好,运行正常,各项技术指标达到标准,符合相关实验要求,验 收合格。 四.验收人签字 xx学院设备分管领导: xx学院验收人员: xx学院验收人员:供应商:

实验室及设备管理处:监察处、审计处:计划财务处:学科发展与建设处(211项目、985项目需此栏) 五.验收时间 年月日 篇五:设备验收报告单11-05 项目编号: 设备验收报告 图片已关闭显示,点此查看 图片已关闭显示,点此查看 甲方(用户)代表:乙方(供货)代表: 日期:_____年____月____日日期:_____年____月____日 篇六:工程设备验收报告表格 设备验收报告 图片已关闭显示,点此查看 图片已关闭显示,点此查看 备注: 如所购设备复杂程度不高,公司有足够的能力进行安装、调试时,由设备管理科或使用部门组织相关部门对设备进行验收。(不需要供货商进行签名验收) 篇七:机械设备验收报告格式 项目名称:合同编号: 验收报告 承制单位:使用单位:日期: - 1 - 设备验收报告 用户单位:xxxxxxxxxxxxx 供货单位:xxxxxxxxxxx 验收日期:验收地点:一、设备内容: 图片已关闭显示,点此查看 二、验收情况:

JAVA单例模式代码详解

java模式之单例模式: 单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。 特点: 1,一个类只能有一个实例 2,自己创建这个实例 3,整个系统都要使用这个实例 例: 在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙" 和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。 Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。在很多操作中,比如建立目录数据库连接都需要这样的单线程操作。一些资源管理器常常设计成单例模式。 外部资源:譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干个通信端口,系统应当集中管理这些通信端口,以避免一个通信端口被两个请求同时调用。内部资源,譬如,大多数的软件都有一个(甚至多个)属性文件存放系统配置。这样的系统应当由一个对象来管理这些属性文件。 一个例子:Windows 回收站。 在整个视窗系统中,回收站只能有一个实例,整个系统都使用这个惟一的实例,而且回收站自行提供自己的实例。因此,回收站是单例模式的应用。 两种形式: 1,饿汉式单例类 public class Singleton { private Singleton(){}

//在自己内部定义自己一个实例,是不是很奇怪? //注意这是private 只供内部调用 private static Singleton instance = new Singleton(); //这里提供了一个供外部访问本class的静态方法,可以直接访问public static Singleton getInstance() { return instance; } } 2,懒汉式单例类 public class Singleton { private static Singleton instance = null; public static synchronized Singleton getInstance() { //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次 //使用时生成实例,提高了效率! if (instance==null) instance=new Singleton(); return instance; } }

Java实现单例模式

2009年05月14日星期四 12:00 Java设计模式圣经连载(04)-单例模式 单例模式是一种常见的设计模式,在《Java与模式》一书中,阎宏博士对单例模式做了全面的总结。 单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。 单例模式有一下特点: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 说明:一下的代码来自阎宏博士的《Java与模式》一书,其中对一些类的写法做调整(符合Java1.5的习惯),另外还加了测试方法。 一、懒汉式单例 在类被加载的时候,唯一实例已经被创建。这个设计模式在Java中容易实现,在别的语言中难以实现。 /** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2007-9-11 * Time: 14:57:08 * <> 单例模式-懒汉式单例 */ public class LazySingleton {

/** * 私有静态对象,加载时候不做初始化 */ private static LazySingleton m_intance=null; /** * 私有构造方法,避免外部创建实例 */ private LazySingleton(){ } /** * 静态工厂方法,返回此类的唯一实例. * 当发现实例没有初始化的时候,才初始化. * @return LazySingleton */ synchronized public static LazySingleton getInstance(){ if(m_intance==null){ m_intance=new LazySingleton(); } return m_intance; } } 二、饿汉式单例

几种常用的设计模式介绍

几种常用的设计模式介绍 1. 设计模式的起源 最早提出“设计模式”概念的是建筑设计大师亚力山大Alexander。在1970年他的《建筑的永恒之道》里描述了投计模式的发现,因为它已经存在了千百年之久,而现代才被通过大量的研究而被发现。 在《建筑的永恒之道》里这样描述:模式是一条由三个部分组成的通用规则:它表示了一个特定环境、一类问题和一个解决方案之间的关系。每一个模式描述了一个不断重复发生的问题,以及该问题解决方案的核心设计。 在他的另一本书《建筑模式语言》中提到了现在已经定义了253种模式。比如: 说明城市主要的结构:亚文化区的镶嵌、分散的工作点、城市的魅力、地方交通区 住宅团组:户型混合、公共性的程度、住宅团组、联排式住宅、丘状住宅、老人天地室内环境和室外环境、阴和阳总是一气呵成 针对住宅:夫妻的领域、儿童的领域、朝东的卧室、农家的厨房、私家的沿街露台、个人居室、起居空间的序列、多床卧室、浴室、大储藏室 针对办公室、车间和公共建筑物:灵活办公空间、共同进餐、共同小组、宾至如归、等候场所、小会议室、半私密办公室 尽管亚力山大的著作是针对建筑领域的,但他的观点实际上适用于所有的工程设计领域,其中也包括软件设计领域。“软件设计模式”,这个术语是在1990年代由Erich Gamma等人从建筑设计领域引入到计算机科学中来的。目前主要有23种。 2. 软件设计模式的分类 2.1. 创建型 创建对象时,不再由我们直接实例化对象;而是根据特定场景,由程序来确定创建对象的方式,从而保证更大的性能、更好的架构优势。创建型模式主要有简单工厂模式(并不是23种设计模式之一)、工厂方法、抽象工厂模式、单例模式、生成器模式和原型模式。 2.2. 结构型 用于帮助将多个对象组织成更大的结构。结构型模式主要有适配器模式、桥接模式、组合器模式、装饰器模式、门面模式、亨元模式和代理模式。 2.3. 行为型 用于帮助系统间各对象的通信,以及如何控制复杂系统中流程。行为型模式主要有命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板模式和访问者模式。

项目验收报告模板

[文档标题]项目验收报告 2017-4-1

。 。 1 目录 一 项目验收申请 ........................................................... 0 1.1 承建单位验收申请 ................................................... 0 1.2 业务部门验收申请 ................................................... 0 二 中标通知书 ............................................................. 0 三 合同................................................................... 0 四 项目施工管理 ........................................................... 0 4.1 启动 ............................................................... 0 4.2 项目实施方案 ....................................................... 0 4.3 施工日志 ........................................................... 1 4.4 会议纪要 ........................................................... 0 4.5 到货验收 ........................................................... 0 4.6 隐蔽工程验收单 ..................................................... 0 4.7 质量检查记录单 ..................................................... 0 4.8 试运行报告 ......................................................... 0 4.9 用户培训记录 ....................................................... 0 4.10 管理员培训记录 ................................................... 0 五 交付................................................................... 0 5.1 设备资产清单 ....................................................... 0 5.2 用户日常操作手册 ................................................... 0 5.3 管理员日常操作手册 ................................................. 0 5.4 项目移交表 ......................................................... 0 六 附件................................................................... 0 6.1 招标文件 ........................................................... 0 6.2 投标文件 ........................................................... 0 6.3 项目过程图片记录 ................................................... 0 6.4 其他文档 ........................................................... 0 6.5 项目验收单 0

Java中常见设计模式面试题

Java中常见设计模式面试题 一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 1.请列举出在JDK中几个常用的设计模式? 单例模式(Singleton pattern)用于Runtime,Calendar和其他的一些类中。工厂模式(Factory pattern)被用于各种不可变的类如Boolean,像Boolean.valueOf,观察者模式(Observer pattern)被用于 Swing 和很多的事件监听中。装饰器设计模式(Decorator design pattern)被用于多个 Java IO 类中。 2.什么是设计模式?你是否在你的代码里面使用过任何设计模式? 设计模式是世界上各种各样程序员用来解决特定设计问题的尝试和测试的方法。设计模式是代码可用性的延伸 3.Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式 单例模式重点在于在整个系统上共享一些创建时较耗资源的对象。整个应用中只维护一个特定类实例,它被所有组件共同使用。https://www.doczj.com/doc/666062868.html,ng.Runtime是单例模式的经典例子。从 Java 5 开始你可以使用枚举(enum)来实现线程安全的单例。 4.在 Java 中,什么叫观察者设计模式(observer design pattern)?

23种模式详解

总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。用一个图片来整体描述一下: 二、设计模式的六大原则 1、开闭原则(Open Close Principle)

开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。 2、里氏代换原则(Liskov Substitution Principle) 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科 3、依赖倒转原则(Dependence Inversion Principle) 这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。 4、接口隔离原则(Interface Segregation Principle) 这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。 5、迪米特法则(最少知道原则)(Demeter Principle) 为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。 6、合成复用原则(Composite Reuse Principle) 原则是尽量使用合成/聚合的方式,而不是使用继承。 三、Java的23中设计模式 从这一块开始,我们详细介绍Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析。 1、工厂方法模式(Factory Method) 工厂方法模式分为三种:

工程验收报告单模板doc

工程验收报告单模板 工程竣工验收报告 图片已关闭显示,点此查看 XXXXXXX中医医院 电视监控系统工程 验收资料 XXXXXXX通信有限公司 XXXXX年4月1日 XXXXXX通信有限公司 系统名称:XXXXXX中医医院网络系统监控设备建设单位: XXXXXX中医医院 设计、施工单位: XXXXXX通信有限公司 验收日期: 图片已关闭显示,点此查看 监控工程竣工验收报告 XXXXX监控施工质量验收 图片已关闭显示,点此查看 XXXXX监控效果验收 图片已关闭显示,点此查看 图片已关闭显示,点此查看 主要设备清单 图片已关闭显示,点此查看

工程竣工验收报告单 图片已关闭显示,点此查看 工程验收报告单 GC-08 编号:001 图片已关闭显示,点此查看 注:工程整体或局部验收后移交有关单位使用或管理的,接管部门意见须参与验收,并在“备注”栏内签署验收意见。 工程验收报告单 图片已关闭显示,点此查看 工程竣工验收单 图片已关闭显示,点此查看 备注:竣工验收中,尚有不影响整体工程质量问题,经双方协商一致可以入住,但必须签订竣工后 遗留问题协议做为入住后解决遗留问题的依据。 工程竣工验收报告单 图片已关闭显示,点此查看 工程竣工验收报告 图片已关闭显示,点此查看 建设工程竣工验收报告 工程名称:1#用房 2#用房 建设单位名称:XXXXXXXXXXXX

竣工验收时间:XX年10月20日 建设工程竣工验收报告 图片已关闭显示,点此查看 图片已关闭显示,点此查看 图片已关闭显示,点此查看 图片已关闭显示,点此查看 图片已关闭显示,点此查看 图片已关闭显示,点此查看 图片已关闭显示,点此查看 工程竣工验收申请报告表表1–1 图片已关闭显示,点此查看 工程竣工验收申请书 我单位施工的工程已于XX年XX月XX日完成设计图纸所有内容,特此申请竣工验收,请贵公司组织有关单位给予检查验收。 施工单位项目经理: 单位技术负责人: 时间: 监理单位: 建设单位:

吉林大学设计模式期末考试试题答案整理

设计模式分为三种类型,共23种。 创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式。 工厂模式(Factory) 意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。 适用性 ●当一个类不知道它所必须创建的对象的类的时候。 ●当一个类希望由它的子类来指定它所创建的对象的时候。 ●当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一 信息局部化的时候。 抽象工厂模式(Abstract Factory) 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 适用性 ●一个系统要独立于它的产品的创建、组合和表示时。 ●一个系统要由多个产品系列中的一个来配置时。 ●当你要强调一系列相关的产品对象的设计以便进行联合使用时。 ●当你提供一个产品类库,而只想显示它们的接口而不是实现时。 建造者模式Builder 意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 适用性 ●当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 ●当构造过程必须允许被构造的对象有不同的表示时。 原型模式Prototype 意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 适用性 ●当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者 ●为了避免创建一个与产品类层次平行的工厂类层次时;或者 ●当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用 合适的状态手工实例化该类更方便一些。 单例模式Singleton 意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 适用性 ●当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 ●当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例 时。 适配器模式Adapter

Java23种设计模式6大原则总结

设计模式概念:一套被反复使用、多数人知晓、经过分类编目的优秀代码设计经验的总结。设计模式要素:模式名称、问题、举例、末态环境、推理、其他有关模式、已知的应用。设计模式分类:创建型、结构型、行为型。 创建型模式功能:1.统所使用的具体类的信息封装起来; 2.类的实例是如何被创建和组织的。 创建型模式作用:1.封装创建逻辑,不仅仅是new一个对象那么简单。 2.封装创建逻辑变化,客户代码尽量不修改,或尽量少修改。 常见的创建型模式:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。常见的结构型模式:代理模式、装饰模式、适配器模式、组合模式、桥梁模式、外观模式、享元模式。 常见行为型模式:模板方法模式、命令模式、责任链模式、策略模式、迭代器模式、中介者模式、观察者模式、备忘录模式、访问者模式、状态模式、解释器模式。单一职责原则:一个类应该只有一个职责。 优点:降低类的复杂性;提高类的可读性;提高代码的可维护性和复用性;降低因变更引起的风险。 里氏替换原则: 优点:代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;提高代码的可重用性;提高代码的可扩展性;提高产品或项目的开放性。 缺点:1.继承是入侵式的。只要继承,就必须拥有父类所有属性和方法。 2.降低代码的灵活性。子类必须拥有父类的属性和方法,使子类收到限制。 3.增强了耦合性。当父类的常量、变量和方法修改时,必须考虑子类的修改,这种 修改可能造成大片的代码需要重构。 依赖倒置原则:高层模块不应该依赖低层模块,两者都依赖其抽象;抽象不依赖细节;细节应该依赖于抽象。 在Java中的表现:模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;接口或抽象类不依赖于是实现类; 实现类依赖于接口或抽象类。 接口隔离原则:1.一个类对另外一个类的依赖性应当是建立在最小的接口上的 2.一个接口代表一个角色,不应当将不同的角色交给一个接口。 3.不应该强迫客户使用它们的不同方法。 如图所示的电子商务系统在三个地方会使用到订单类:一个是门户,只能有查询方法;一个是外部系统,有添加订单的方法;一个是管理后台,添加、删除、修改、查询都要用到。“原子”在实践中的衡量规则: 1.一个接口只对一个子模块或者业务逻辑进行分类。 2.只保留接口中业务逻辑需要的public方法。 3.尽量修改污染了的接口,若修改的风险较大,则可采用适配器模式进行转化处理。 4.接口设计应因项目而异,因环境而异,不能照搬教条。 迪米特法则:(表述)只与你直接的朋友们通信;不要跟“陌生人”说话;每一个软件单位 对其他的单位都只有最少的了解,这些了解仅局限于那些与本单位密 切相关的软件单位。 对迪米特法则进行模式设计有两个:外观模式、中介者模式。 开闭原则:一个软件实体应当对扩展开放,对修改关闭。 重要性体现:提高复用性;提高维护性;提高灵活性;易于测试

设计模式主要分三个类型

设计模式主要分三个类型:创建型、结构型和行为型。 其中创建型有: 一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。 三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。 四、Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。 五、Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。 行为型有: 六、Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。 七、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。 八、Template Method,模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。 九、Command,命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。 十、State,状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。 十一、Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。 十二、China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系 十三、Mediator,中介者模式:用一个中介对象封装一些列的对象交互。 十四、Visitor,访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。 十五、Interpreter,解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 十六、Memento,备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 结构型有: 十七、Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。 十八、Facade,外观模式:为子系统中的一组接口提供一致的界面,fa?ade 提供了一高层接口,这个接口使得子系统更容易使用。 十九、Proxy,代理模式:为其他对象提供一种代理以控制对这个对象的访问

设计模式知识点整理

设计模式综述: 什么是设计模式? Christopher Alexander说:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心,这样,你就能一次又一次地使用该方案而不必做重复劳动”。 设计模式就是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。 设计模式的基本要素? 一般而言,一个模式有四个基本要素: 模式名称——一个助记名,它用一两个词来描述模式的问题、解决方案和效果。 问题——描述了应该在何时使用模式。 解决方案——描述了设计的组成部分。 效果——描述了模式应用的效果及使用模式应权衡的问题。 设计模式的分类? 我们根据两条准则对模式进行分类: 第一是目的准则,即模式是用来完成什么工作的: 模式依据其目的可分为创建型(Creational)、结构型(Structural)或行为型(Behavioral)三种,创建型模式与对象的创建有关,结构型模式处理类或对象的组合,行为型模式对类或对象怎样交互和怎样分配职责进行描述。 第二是范围准则,即指定模式主要是用于类还是用于对象: 创建型类模式:将对象的部分创建工作延迟到子类 创建型对象模式:将对象的部分创建工作延迟到另一个对象中 结构型类模式:使用继承机制来组合类 结构型对象模式:描述了对象的组装方式 行为型类模式:使用继承描述算法和控制流 行为型对象模式:描述一组对象怎样写作完成单个对象所无法完成的任务 第一个设计模式——单例模式(创建型模式) 先来看看下面这幅图片:

这是windows任务管理器,当我们打开一个任务管理器窗口后,如果试图再打开一个任务管理器窗口,会发现打不开,显示的还是原来的那个窗口,也就是说,任务管理器窗口只能打开一个,不可能打开多个,这就用到了单例模式。那么,什么是单例模式呢? 单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。 知道了单例模式的定义后,我们如果想自己创建一个单例模式,该怎么做呢? 先看下面的java代码: //Singleton.java public class Singleton{ //定义该类的一个实例,类型为静态私有的 private static Singleton singleton; //定义一个字符串成员变量,用于对单例模式做测试 public String name; //将构造方法设为私有的 private Singleton(){} //给该类添加一个公有静态的方法,名为getInstance,用于返回该类的一个实例 //在该类的内部,判断该类的实例是否为null public static Singleton getInstance(){ if(singleton == null){ singleton = new Singleton(); } return singleton; }

相关主题
文本预览
相关文档 最新文档