Java设计模式偷跑系列(六)Singleton模式的建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39784403

单例模式(Singleton):是一种经常使用的设计模式。

在Java应用中。单例对象能保证在一个JVM中。该对象仅仅有一个实例存在。

优点主要有:1、某些类创建比較频繁,对于一些大型的对象,这是一笔非常大的系统开销。

2、省去了new操作符,减少了系统内存的使用频率,减轻GC压力。

单例模式主要有两种实现方式:1、懒汉式。2、饿汉式

一、uml建模

二、代码实现:

1、懒汉式

/**
 * 演示样例:单例--单例对象能保证在一个JVM中。该对象仅仅有一个实例存在。
 *
 * 缺点:这样的做法在多线程环境下,不安全
 *
 * 懒汉式
 */

class Singleton {
	/**
	 * 持有私有静态变量(也称类变量),防止被引用
	 *
	 * 此处赋值为null。目的是实现延迟载入 (由于有些类比較庞大,所以延迟载入有助于提升性能)
	 */
	private static Singleton instance = null;

	/** 私有构造方法,防止被实例化 */
	private Singleton() {

	}

	/** 静态工厂方法,创建实例 --仅仅只是这里是创建自己,并且仅仅能创建一个 */
	public static Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton();
		}
		return instance;
	}

	public void info() {
		System.out.println("this is a test method...");
	}
}

/**
 * client測试类
 *
 * @author Leo
 */
public class Test {
	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		/**
		 * 调用普通方法
		 */
		s1.info();
		Singleton s2 = Singleton.getInstance();
		/**
		 * 执行结果为true。说明s1、s2这两个类变量都指向内存中的同一个对象
		 */
		System.out.println(s1 == s2);
	}
}

2、饿汉式

/**
 * 饿汉式
 */

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

	private Singleton() {

	}

	public static Singleton getInstance() {
		return instance;
	}

	public void info() {
		System.out.println("this is a test method...");
	}
}

/**
 * client測试类
 *
 * @author Leo
 */
public class Test {
	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		/**
		 * 调用普通方法
		 */
		s1.info();
		Singleton s2 = Singleton.getInstance();
		/**
		 * 执行结果为true,说明s1、s2这两个类变量都指向内存中的同一个对象
		 */
		System.out.println(s1 == s2);
	}

}

3、假设考虑多线程,那么getInstance()方法要加同步synchronized,这时饿汉式比懒汉式要好。虽然资源利用率要差,可是不用同步。

/**
 *
 * 考虑多线程的时候。以下这样的做法能够參考一下:--懒汉式
 *
 * 在创建类的时候进行同步。所以仅仅要将创建和getInstance()分开,单独为创建加synchronizedkeyword
 *
 * 这样的做法考虑性能的话,整个程序仅仅需创建一次实例,所以性能也不会有什么影响。
 *
 * @author Leo
 */
public class SingletonTest {

	private static SingletonTest instance = null;

	private SingletonTest() {
	}

	private static synchronized void syncInit() {
		if (instance == null) {
			instance = new SingletonTest();
		}
	}

	public static SingletonTest getInstance() {
		if (instance == null) {
			syncInit();
		}
		return instance;
	}
}

三、总结

单例模式保证了一个类仅仅有一个实例,且提供一个訪问全局点的方式,更加灵活的保证了实例的创建和訪问约束。

系统中仅仅有一个实例。因此构造方法应该为私有 饿汉式:类载入时直接创建静态实例。懒汉式:第一次须要时才创建一个实例,那么getInstance方法要加同步 饿汉式比懒汉式要好。虽然资源利用率要差。可是不用同步。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-07 12:21:05

Java设计模式偷跑系列(六)Singleton模式的建模与实现的相关文章

Java设计模式偷跑系列(十八)建模和责任链模式的实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018231 责任链模式(ChainOfResponsibility): 有多个对象,每一个对象持有下一个对象的引用,形成一条链.请求在这条链上传递.直到某一对象决定处理该请求,可是发出者并不清楚终于哪个对象会处理该请求. 一.uml建模: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGh5X3ljdQ==/font/5a6L5L2T/fo

设计模式总结篇系列:策略模式(Strategy)

前面的博文中分别介绍了Java设计模式中的创建型模式和结构型模式.从本文开始,将分别介绍设计模式中的第三大类,行为型模式.首先我们了解下分为此三大类的依据. 创建型模式:主要侧重于对象的创建过程: 结构型模式:主要侧重于处理类或对象的组合: 行为型模式:主要侧重于类或对象之间的交互以及职责分配. 首先了解下策略模式的概念:定义了多个算法,并将它们封装起来(一般的是每个算法封装成一个单独的类),让算法独立于客户端而可以单独变化. 具体可以看一下下面的例子(以计算加.减.乘为例): 1. 对加.减.

设计模式总结篇系列:代理模式(Proxy)

时代在发展,我们发现,现在不少明星都开始进行微访谈之类的,有越来越多的参与捐赠等.新的一天开始了,首先看下新的一天的日程安排: 1 interface Schedule{ 2 3 public void weiTalk(); 4 5 public void donation(); 6 7 } Schedule接口定义了今天的形成安排,主要包括微访谈和捐款.那么看一下实现此接口的明星类定义: 1 class Star implements Schedule { 2 3 @Override 4 pu

设计模式总结篇系列:组合模式(Composite)

在探讨Java组合模式之前,先要明白几个概念的区别:继承.组合和聚合. 继承是is-a的关系.组合和聚合有点像,有些书上没有作区分,都称之为has-a,有些书上对其进行了较为严格区分,组合是contains-a关系,聚合是has-a关系. 组合方式中被组合的对象生命周期不能超过整体,一般写代码时是直接在整体类的构造方法中创建被组合类的对象.如人和手之间的关系,人都没了,还何来手? 聚合方式中对于对象的生命周期则没有此类限制,一般可以在聚合类的构造函数中通过外部传参以赋值给整体(或通过其他set等

java设计模式(二)单例模式 建造者模式

(三)单例模式 单例模式应该是最常见的设计模式,作用是保证在JVM中,该对象只有一个实例存在. 优点:1.减少某些创建比较频繁的或者比较大型的对象的系统开销. 2.省去了new操作符,降低系统内存使用频率,减轻GC压力. 3.保证核心代码的唯一性,比如交易引擎. 单例模式看似是最简单的设计模式. public class Singleton { //私有构造方法,防止实例化 private Singleton(){ } //创建类的实例的时候加载 private static Factory f

Java设计模式(八)观察者模式 迭代器模式

(十五)观察者模式 观察者模式,定义对象间一对多关系,一个对象状态发生改变,所有依赖于它的对象都收到通知并且自动更新,观察者与被观察者分开.例如邮件订阅.RSS订阅,如果有更新就会邮件通知你. interface Observers{ public void update(); } class Observer1 implements Observers{ public void update(){ System.out.println("observer1 has received"

Java设计模式(一) 简单工厂模式不简单

原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自Jason's Blog,原文链接 http://www.jasongj.com/design_pattern/simple_factory 简单工厂模式使用案例 有一种抽象产品--汽车(Car),同时有多种具体的子类产品,如BenzCar,BMWCar,LandRoverCar.类图如下 作为司机,如果要开其中一种车,比如BenzCar,最直接的做法是直接创建BenzCar的实例,并执行其drive方法,如下 package com.

Java设计模式(一)普通工场模式,抽象工场模式

设计模式 设计模式我觉得是前人总结的,为了解决一类问题而总结的代码设计经验.最初可能为了使用而使用,后面就会发现,很多没想到的问题因为使用了正确的设计模式已经为你考虑到了.<design patterns设计模式>这本书是程序员进阶必学. (一)工厂模式 工厂模式的意义在于定义一个用于创建对象的接口,并控制返回哪个类的实例.网上比较流行的一个普通工厂模式的例子. interface Sender{ public void send(); } class MainSender implement

【C++自我精讲】基础系列六 PIMPL模式

0 前言 很实用的一种基础模式. 1 PIMPL解释 PIMPL(Private Implementation 或 Pointer to Implementation)是通过一个私有的成员指针,将指针所指向的类的内部实现数据进行隐藏. 2 PIMPL优点 举例: //x.h class X { public: void Fun(); private: int i; //add int i; }; //c.h #include <x.h> class C { public: void Fun()