[Js-设计模式]单例模式(饿汉,懒汉,登记式)

·单例模式的特点:

  1. 单例类只能有一个实例。

  2. 单例类必须自己创建自己的唯一实例。

  3. 单例类必须给所有其他对象提供这一实例。

·各种单例模式的特点:

  ·懒汉式是延时加载,在需要的时候才创建对象,避免内存浪费,但存在线程安全问题。

  ·饿汉式线程安全,类一加载就实例化对象,所以要提前占用系统资源。

  ·登记式单例模式克服了饿汉以及懒汉单例的不可继承问题,其子类在登记时才被创建,并且子类的实例化方式只能是饿汉式。

·各种单例模式的类图:

  ·饿汉式单例模式

  

  ·懒汉式单例模式:

  

  ·登记式单例模式:

  

· 各种单例模式的实现(Java):

 1 package com.neu.core;
 2
 3 /**
 4  * Only once instance of the class may be created during the execution of any
 5  * given program. Instances of this class should be acquired through the
 6  * getInstance() method. Notice that there are no public constructors for this
 7  * class.
 8  */
 9 public class EagerSingleton {
10     private static final EagerSingleton m_instance = new EagerSingleton();
11
12     protected EagerSingleton() { }
13
14     public static EagerSingleton getInstance() {
15         return m_instance;
16     }
17 }

=======================神奇的分割线==========================

 1 package com.neu.core;
 2
 3 /**
 4  * Only once instance of the class may be created during the execution of any
 5  * given program. Instances of this class should be acquired through the
 6  * getInstance() method. Notice that there are no public constructors for this
 7  * class.
 8  */
 9 public class LazySingleton {
10     private static LazySingleton m_instance = null;
11
12     private LazySingleton() { }
13
14     synchronized public static LazySingleton getInstance() {
15         if (m_instance == null) {
16             m_instance = new LazySingleton();
17         }
18         return m_instance;
19     }
20 }

=======================神奇的分割线==========================

 1 package com.neu.core;
 2
 3 import java.util.HashMap;
 4
 5 public class RegSingleton {
 6     static private HashMap m_registry = new HashMap();
 7
 8     static {
 9         RegSingleton x = new RegSingleton();
10         m_registry.put(x.getClass().getName(), x);
11     }
12
13     protected RegSingleton() {
14     }
15
16     static public RegSingleton getInstance(String name) {
17         if (name == null) {
18             name = "com.neu.core.RegSingleton";
19         }
20
21         // System.out.println("From RegSingleton: requesting for " + name );
22
23         if (m_registry.get(name) == null) {
24             try {
25                 m_registry.put(name, Class.forName(name).newInstance());
26             } catch (Exception e) {
27                 e.printStackTrace();
28             }
29         }
30         return (RegSingleton) (m_registry.get(name));
31     }
32
33     public String about() {
34         return "Hello, I am RegSingleton.";
35     }
36
37 }
 1 package com.neu.core;
 2
 3 /**
 4  * This class is a subclass of RegSingleton
 5  */
 6 public class RegSingletonChild extends RegSingleton {
 7     public RegSingletonChild() {
 8     }
 9
10     static public RegSingletonChild getInstance() {
11         return (RegSingletonChild) RegSingleton.getInstance("com.javapatterns.singleton.demos.RegSingletonChild");
12     }
13
14     public String about() {
15         return "Hello, I am RegSingletonChild.";
16     }
17
18 }

原文地址:https://www.cnblogs.com/jiasq/p/8524886.html

时间: 2024-10-16 15:53:03

[Js-设计模式]单例模式(饿汉,懒汉,登记式)的相关文章

单例设计模式之饿汉式(静态常量)

package com.waibizi; /** * 单例设计模式之饿汉式(静态常量) * 步骤 * 1.构造器私有化(防止new) * 2.类的内部创建对象 * 3.向外暴露一个静态的公共方法 getInstance * 4.代码实现 * @author 歪鼻子 * * *优点:这种写法比较简单,类加载的时候就完成了实例化.避免了线程同步问题 *缺点:类装载的时候就完成了实例化,如果从开始到至终都没使用过这个类,势必会造成资源的浪费 *结论:这种单例模式是可用的,可能会导致浪费(调用getIn

单例设计模式之饿汉式(静态代码块)

package com.waibizi.demo02; /** * 单例设计模式之饿汉式(静态代码块) * 这种方式与饿汉式静态常量的方式是类似的,类装载的时候也有直接创建对象 * @author 歪鼻子 * */ @SuppressWarnings("all") public class Singleton_Pattern { public static void main(String[] args) { // TODO Auto-generated method stub } }

Java-设计模式-单例模式-饿汉模式、懒汉模式

//-------------------------------------------------------------饿汉模式--开始----------------------------------------------------------- package com.study.DesignPattern01; /** * 创建一个饿汉模式的单例 * @author ZLHome *有些对象,我们只需要一个,如果多了,那么就可能导致数据不一致, 占用资源过多等等,比如: 配置文

Spring -11 -单例设计模式 -懒汉式/饿汉式(idea默认的)

单例设计模式 作用: 在应用程序有保证最多只能有一个实例. 好处: 2.1 提升运行效率. 2.2 实现数据共享. 案例:application 对象 懒汉式 3.1 对象只有被调用时才去创建. 3.2  示例代码 3.3由于添加了锁,所以导致效率低. public class lazySingleton { //懒汉式,单例模式! //由于对象需要被静态方法调用,把方法设置为static //由于对象是static,必须要设置访问权限修饰符为private , //如果是public 可以直接

java===单类设计模式之饿汉式与懒汉式

package cn.china; public class Single { public static void main(String[]args){ // S singles=S.getInstance(); // S singless=S.getInstance(); // System.out.println(singles==singless); Test tt=Test.getInstance(); Test ttt=Test.getInstance(); tt.setNum(1

单例设计模式之饿汉式与懒汉式

/* 设计模式:对问题行之有效的解决方式.其实它是一种思想. 1,单例设计模式. 解决的问题:就是可以保证一个类在内存中的对象唯一性. 必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性. 如何保证对象唯一性呢? 1,不允许其他程序用new创建该类对象. 2,在该类创建一个本类实例. 3,对外提供一个方法让其他程序可以获取该对象. 步骤: 1,私有化该类构造函数. 2,通过new在本类中创建一个本类对象. 3,定义一个公有的方法,将创建的对象返回. */ //饿汉式 class

设计模式中饿汉式单例类和懒汉式单例类

单例模式的特点为: *单例类只有一个实例. *单例类必须自己创建自己的唯一实例. *单例类必须给所有其他对象提供这一实例. 饿汉式单例类: 而饿汉式单例类则在java语言中是最为简单的单例类,这是一个描述饿汉式单例类的类图的实现. 此类图中,此类已经将自己实例化. 源码为: package singleton; public class EagerSingleton { private static EagerSingleton instance=new EagerSingleton(); /*

Java---15---单例设计模式:---饿汉式和懒汉式

概念: 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.   单例模式有以下特点: 1.单例类只能有一个实例 2.单例类必须自己给自己创建自己的唯一实例 3.单例类必须给所有其他对象提供这一实例 饿汉式: /*饿汉式*/ class Single { private static final Single s = new Single(); private Single () {} public static Single getInstance() { return s

单例设计模式---懒汉式+饿汉式

package com.Thread; /** * 单例设计模式:确保一个类只有一个对象 */ public class Synchronized_Singleton { public static void main(String[] args) { JvmThread jvm1= new JvmThread(100); JvmThread jvm2= new JvmThread(100); jvm1.start(); jvm2.start(); } } /** * 懒汉式(饿汉式:在声明静态

单例模式--饿汉、懒汉、多线程以及多线程下改进

代码注释有介绍 package singleton; /** * @author: ycz * @date: 2018/12/24 0024 22:15 * @description: 懒汉模式 */ public class SingleTon1 { public SingleTon1(){} private static SingleTon1 instance1 = null; public static SingleTon1 getInstance1(){ if (instance1==n