java语言实现创建型设计模式—单例模式

一、描述

单例模式就是确保一个类只有一个实例对象,并且在实例对象必须自动创建,对外不提供该对象的构造方法,并向整个系统提供该实例。使用单例模式相当于整个系统共用该类的实例对象,对于java中的并发访问有重要意义。

单例模式又分为饿汉模式和饱汉模式两种,饿汉模式就是在类加载的时候就创建和初始化该类的唯一的实例对象,而饱汉模式是系统需要用到这个类的实例的时候才创建该对象。

二、单例模式的优缺点

优点:在单列模式中,客户端调用类的实例时,只能调用一个公共的接口,这就为整个系统提供了一个共享的对象。因为在系统内存中只存在一个对象,所以可以节约系统资源,相对于那些需要频繁创建和销毁的对象的类来说无疑提高了效率。而且由类自己来控制实例化过程,类就在改变实例化进程上有相应的伸缩性。

缺点:实现单例模式的类在实例化后不能被别的类继承;而且一个类只有唯一的对象,那么这个单例类的职责就会过重,在一定程度上违背了“单一职责原则”;类的实例在初始化后就不能再更改也不适合于类的实例经常变动的场景;如果在分布式系统中,当系统中的单例类被复制到不同的虚拟机下,在每个虚拟机中都会创建一个实例对象,要分清具体哪个虚拟机下运行哪个单例对象比较困难;再者,由于单例模式中的实例是一个共享的概念,在并发访问时需要附加代码保证其访问安全性。

三、源代码

package tong.yue.day4_25;

import java.io.IOException;
/**
 * 单例模式是一种非常常见的设计模式,即一个类只能有一个对象(实例),一般通过将该类的构造器私有化,来阻止在该类外创建该类的对象,并提供给外界一个唯一的对象(这个对象在该类中创建)。
 * java中的单例模式常见的有两种实现方式,一种是恶汉方式,即将该类对象用static休息并且在类加载的时候进行初始化;
 * 另一种是饱汉方式,在程序中需要用到该对象的时候才初始化,一旦初始化一次就不会再重新生成该对象。
 * jdk中的Runtime类其实也是一种单例模式,而且其采用的是饿汉的方式。
 * @author Administrator
 *
 */

public class Singleton {

	public static void main(String[] args) {

		//饿汉式获取单例类的对象
		Singleton_eager singleton = Singleton_eager.getInstance();
		singleton.print();
		//饿汉式获取单例类的对象
		Singleton_lazy singleton_lazy = Singleton_lazy.getInstance();
		singleton_lazy.print();
	}
}
//饿汉式单例模式,在类加载的时候创建一个对象,之后就不再重复创建
class Singleton_eager {
	//声明为static类型,在类加载的时候创建一个对象
	private static Singleton_eager singleton_eager = new Singleton_eager();
	private Singleton_eager(){

	}

	public static Singleton_eager getInstance() {
		return singleton_eager;
	}

	public void print() {
		System.out.println(singleton_eager);
	}
}
//饱汉式单例模式,当程序第一次使用该类的对象时创建对象,只创建一次,之后就不再重复创建
class Singleton_lazy{
	private static Singleton_lazy singleton_lazy = null;
	private Singleton_lazy(){}
	//单例对象的创建方法需要加上同步,因为在多线程并发访问时要保证其访问安全性和统一性。
	public synchronized static Singleton_lazy getInstance() {
		//若是第一次使用该对象,那个就创建一个,否则就使用一个已经创建好的对象
		if (singleton_lazy==null) {
			singleton_lazy = new Singleton_lazy();
		}
		return singleton_lazy;
	}

	public void print() {
		System.out.println(singleton_lazy);
	}
}

运行结果:

四、总结

以上两种方案的构造函数和公用方法都是静态的(static),则这个类实例是共享的。只是饿汉式在类加载的时候已经创建了对象,每次调用的时候不用再创建而是直接返回已经创建好的实例。这样节省了时间,但却占用了空间,实例本身为static的会一直驻留内存。

懒汉式在类加载时不创建对象,而是在程序使用到这个类的对象时才创建一次,以后每次使用该实例对象,则是判断是否存在,若存在就加载,不存在就创建,这势必会影响程序运行的速度。最关键的是,在并发的情况下,懒汉式是不安全的,如果两个线程:线程1和线程2,在同一时间调用getInstance()方法,如果线程1先进入if语句刚刚判断没有该对象,准备创建对象时,线程发生了切换,然后线程2进行控制判断if语句没有对象也会创建,那么就会有两个实例被创建,所以懒汉式单例模式的getInstance()方法要加上同步控制符synchronized,以保证并发访问的安全性。

时间: 2024-12-13 12:29:37

java语言实现创建型设计模式—单例模式的相关文章

java语言实现创建型设计模式—原型模式(Prototype)

一.描述 原型模式是通过一个原型对象来标明要创建的对象的类型,然后用复制这个原型对象的方法来拷贝创建更多的同类型对象.例如我们在程序的动态运行过程中有了一个对象,这个对象中包含了一系列的有效数据,我们此时需要一个和该对象完全相同的新对象,并且在拷贝之后,新旧对象之间没有任何联系,对任何一个对象的更改都不影响另一个对象. 在java中所有类都默认继承自java.lang.Object类,在这个Object类中有一个clone()方法,该方法将返回Object对象的一个拷贝. 我们让需要被拷贝的类实

java语言实现创建型设计模式—工厂方法模式

一.描述 基于简单工厂模式中将所有类的创建和初始化放在一个工厂类中出现的问题,我们引进了工厂方法模式,该模式是GoF总结的23种设计模式的第一种,这个设计模式将一个工厂类拆分成多个具体的工厂类,每个具体的工厂类负责相应的类的对象的创建. 在工厂方法模式中,抽象工厂类负责定义创建对象的接口,具体对象的创建由实现该抽象工厂的具体工厂类来完成,它由四部分组成:抽象工厂类.实现抽象工厂类的具体工厂类.抽象类.实现抽象类的具体类. 二.工厂方法模式的优缺点 优点:在工厂方法模式中,创建对象的任务由具体的工

java语言实现创建型设计模式—创建者模式

一.描述 创建者模式单独利用一个创建者类来创建对象并组建对象之间的关系,以简化客户端调用的复杂性.相对于抽象方法模式来说,创建者模式增加了一个单独的用于组装对象和对象之间关系的创建者类,由该类来负责对象的组装,以此来更加清晰地划分各个类的职责. 创建者模式将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示,而且对客户端屏蔽了对象的构建细节,该模式主要由5个部分组成:组装类.抽象创建者类,实现了抽象创建者类的具体创建者类,抽象产品类.实现了抽象产品类的具体产品类.在此可以看出

java语言实现创建型设计模式—抽象工厂模式

一.描述 抽象工厂模式是在工厂方法的模式上进一步抽象而来,如果说工厂方法模式是对一个产品结构的创建而言的话,那么抽象工厂模式则是针对多个产品结构而言的,它被用来一次创建多个不同的产品对象. 我们要创建一个摩托车轮胎和摩托车把手,又要创建一个自行车轮胎和自行车把手,如果我们使用工厂方法模式的话我们需要四个类:创建摩托车轮胎的工厂类,创建摩托车把手的工厂类,创建自行车轮胎的工厂类和创建自行车把手的工厂类,但是如果我们使用抽象工厂方法的话,我们需要创建两个工厂类:创建摩托车轮胎和把手的工厂类,创建自行

java语言实现创建型模式——简单工厂模式

一.描述 简单工厂模式又名静态工厂方法模式,是所有工厂模式中最简单的一个,它定义一个具体的工厂类来负责创建所有类的对象并初始化创建的对象,它主要由3部分组成:工厂类.抽象类.实现抽象类的具体类,然后通过客户端调用工厂类创建相应的对象. 注意:简单工厂模式不属于GoF总结的23种设计模式,它是相当于初学java的HelloWorld案例,帮助初学者了解设计模式,增长信心的一个设计模式. 二.简单工厂模式的优缺点 优点:相对于直接在客户端创建对象并初始化对象的值来说,简单工厂模式将创建对象和初始化任

创建型设计模式-----单例模式

1:单例模式: 保证一个类中只有一个实例,并提供一个访问它的实例的方法. 最牛逼的单例模式是双重检验: class Singleton{ private Singleton(){}; //私有方法 private static Singleton instance=null; //将类的实例定义为静态的 public Singleton getInstanSingleton(){ if(instance==null){ //因为同步是费时间的,所以先判断是否为空,再同步 synchronized

设计模式之:创建型设计模式(6种)

创建型设计模式有: 共6种 简单工厂模式(Simple Factory) 工厂方法模式(Factory Method) 抽象工厂模式(Abstract Factory) 建造者模式(Builder) 原型模式(Prototype) 单例模式(Singleton) 简单工厂模式 功能:主要用于创建对象.新添加类时,不会影响以前的系统代码.核心思想是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果. 优点: 适用于不同情况创建不同的类时 缺点: 客户端必须要知

创建型设计模式总结(二)

上篇文章我们介绍了创建型设计模式的前三种:简单工厂模式.工厂方法模式和抽象工厂模式.这一篇文章,我们系统介绍一下其他的三种创建型设计模式:创建者模式.原型模式和单例模式. 一.创建者模式 创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象. 创建者模式通常包括如下几种角色: 1.建造者角色(Builder) 对复杂对象的

六种创建型设计模式的比较和总结

一.描述 创建型设计模式包括如下几个:简单工厂模式(Simple Factory).工厂方法模式(Factory Method).抽象工厂模式(Abstract Factory).创建者模式(Builder).原型模式(Prototype).单例模式(Singleton). 二.六种创建型设计模式的比较 简单工厂模式:简单工厂模式又叫静态工厂模式,它定义一个具体的工厂类来负责所有产品对象的创建,因此这个工厂类的职责过大,当客户端UI与某些产品的创建有不同的要求时,需要不断地修改工厂类,增加判断逻