设计模式(二)单例模式(创建型)

使用场景:

一个类只能创建一个实例对象。如读取服务器配置文件的类,由单个实例对象直接读取。

实现流程:

(1)、定义一个私有变量;

(2)、将构造函数私有化;

(3)、提供一个获取实例的公用方法;

下面列出几种常见的实现模式,仅供参考:

饿汉式单例:在类创建的时候就初始化实例对象,每次调用的时候都是获取同一对象实例,是线程安全的。

实现类:

public class HungrySingleton {

    private static HungrySingleton instance = new HungrySingleton();

    private HungrySingleton(){};

    public static HungrySingleton getInstance(){
        return instance;
    }

}

测试类:

public class HungrySingletonTest {

    private class MyThread extends Thread{

        @Override
        public void run(){
            System.out.println(HungrySingleton.getInstance().hashCode());
        }

    }

    public static void main(String[] args) {
        MyThread[] mts = new MyThread[10];
        for(int i = 0 ; i < mts.length ; i++){
            mts[i] = new HungrySingletonTest().new MyThread();
        }  

        for (int j = 0; j < mts.length; j++) {
            mts[j].start();
        }
    }

}

测试结果:

从测试结果可以看出,该方式是线程安全的。

普通懒汉式单例:创建类的时候不实例化对象,在调用获取实例方法的时候才创建对象。是线程不安全的。

实现类:

public class LazySingleton {

    private static LazySingleton instance = null;

    private LazySingleton(){};

    public static LazySingleton getInstance(){
        if(instance == null){
            instance = new LazySingleton();
        }
        return instance;
    }

}

测试类:

public class LazySingletonTest {

    private class MyThread extends Thread{

        @Override
        public void run(){
            System.out.println(LazySingleton.getInstance().hashCode());
        }

    }

    public static void main(String[] args) {
        MyThread[] mts = new MyThread[10];
        for(int i = 0 ; i < mts.length ; i++){
            mts[i] = new LazySingletonTest().new MyThread();
        }  

        for (int j = 0; j < mts.length; j++) {
            mts[j].start();
        }
    }

}

测试结果:

从测试结果可以看出,该方式是线程不安全的。

对线程不安全的懒汉式单例模式,有多种的解决方案。简单的如:在获取实例的公共方法里加上同步标识符synchronized。这样的话可以保证在多线程的环境下获取的实例是唯一的,但也相应地影响了效率。这里列举一种常规的解决方案——Double Check Locking双检查锁机制。

双检查锁机制(DCL)

实现类:

public class DclSingleton {

    //使用volatile保证线程间可见性
    private static volatile DclSingleton instance = null;

    private DclSingleton(){};

    public static  DclSingleton getInstance(){
        if(instance == null){
            synchronized(DclSingleton.class){
                //二次检查
                if(instance == null){
                    instance = new DclSingleton();
                }
            }
        }
        return instance;
    }

}

测试结果:

从测试结果可以看出,该方式是线程安全的,且将同步的范围限制到了最小。是推荐的一种单例实现方式。

时间: 2024-08-28 23:26:46

设计模式(二)单例模式(创建型)的相关文章

天天设计模式二:创建型模式实践

天天设计模式二:创建型模式实践 创建型设计模式主要应用在对象创建,以不同的方式来满足系统的灵活性配置.动态注入.等应用场景. 一.单例模式 二.抽象工厂 三.建造者模式 四.工厂方法模式 五.原型模式

设计模式(3)-对象创建型模式-Abstract Factory模式

1.对象创建型模式 1.3           Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: ?  一个系统要独立于它的产品的创建.组合和表示时(这个需求和FactoryMethod类似). ?  一个系统要由多个产品系列中的一个来配置时(这个需求也和Factory Method类似). ?  当你要强调一系列相关的产品对象的设计以便进行联合使用时(这个需求表明一个工厂要创建多个相关的产品对象,是比FactoryMethod多的

Java设计模式之五大创建型模式(附实例和详解)

一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. (3)行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 二.设计模式的六大原则 1.开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修

一天一个设计模式(二) -单例模式(Singleton)

前言 单例模式 (Singleton) 是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点. 正文 (一). 优缺点 Java中单例模式 (Singleton) 是一种广泛使用的设计模式.单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在.一些管理器和控制器常被设计成单例模式. 1. 优点 提供了对唯一实例的受控访问. 由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象

小菜学设计模式——设计模式总结之创建型

1.面向过程与面向对象 1)面向过程通过划分功能模块,通过函数间相互调用来实现,但需求变化时就需要更改函数,而你改动的函数有多少地方在调用她呢?关联多少数据,这是很不容易弄得清楚地地方.或许开发者本人弄得清楚,但是下一个维护人员未必能够吃透.所以,由于这种强耦合性直接导致程序的扩展性和可维护性降低,后期维护的成本自然增高了不少. 2)面向对象关注的是对象,对象的优点在于,可以定义自己负责的事务,做要求它自己做的事情.对象应该自己负责自己,而且应该清楚的定义责任. 3)一般面向对象开发只是关心这么

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

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

设计模式一:创建型模式

知识储备: 1.接口:若干抽象方法的集合 作用:限制实现接口的类必须按照接口给定的调用方式实现这些方法:对高层模块隐藏了类的内部实现. 2.面向对象设计SOLID原则 开放封闭原则:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭.即软件实体应尽量在不修改原有代码的情况下进行扩展. 里氏替换原则:所有引用父类的地方必须能透明的使用其子类的对象. 依赖倒置原则:高层模块不应该依赖底层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象.换言之,要针对接口编程,而不是针对实现编程.

NET设计模式 第二部分 创建型模式(6):创建型模式专题总结(Creational Pattern)

创建型模式专题总结(Creational Pattern) ——.NET设计模式系列之七 Terrylee,2006年1月 概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统独立于如何创建.组合和表示它的那些对象.本文对五种常用创建型模式进行了比较,通过一个游戏开发场景的例子来说该如何使用创建型模式. 为什么需要创建型模式 所有的创建型模式都有两个永恒的主旋律:第一,它们都将系统使用哪些具体类的信息封装起来:第二,它们隐藏了这些类的实例是如何被创建和组织的.外界对于这些

设计模式学习笔记-创建型模式总结

一.总结 创建型模式抽象了实例化的过程:它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象 创建型模式将实例化委托给另一个对象. 在这些模式中有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在 一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以及何时创建这些方面给予 了我们很大的灵活性.它们允许

设计模式感悟之创建型模式

创建型模式总结:     地球(客户)需要一个大自然(产品),该大自然需要有很多动物(产品功能),很多植物(产品功能).大自然使用单例模式和抽象工厂模式的结合模式.动物和植物采用简单工厂方法模式创建.以创建动物为例:在简单工厂里遇到相同的"人",直接采用原型模式克隆,法则采用建造者模式创建. public Animal {     private String mType = null;     public Animal clone()     {           ...