(一)设计模式系列---单例模式

一、单例模式

在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。

二、分类

分为懒汉式和饿汉式两种;

三、应用场景

 1.需要频繁实例化然后销毁的对象。 
    2.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。 
    3.有状态的工具类对象。 
    4.频繁访问数据库或文件的对象。

四:代码实现

1.饿汉式

public class Person {
    /*
     1.用final修饰,保证引用不可改变,保证唯一性;
     2.饿汉式优缺点
     优点
    (1)线程安全
    (2)在类加载的同时已经创建好一个静态对象,调用时反应速度快
    缺点
    资源效率不高,可能getInstance()永远不会执行到,
    但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化
     */
    public static final Person person = new Person();
    private             String name;

    /**
     * 单例模式构造函数要私有化,防止外部创建
     */
    private Person() {

    }

    public static Person getInstance() {
        return person;
    }

}
public String getName() {    return name;}

public void setName(String name) {    this.name = name;}
 

添加测试方法

public class SingletonTest
{
    public static void main( String[] args )
    {
        Person person1 = Person.getInstance();
        Person person2 = Person.getInstance();
        Person person3 = Person.getInstance();
        Person person4 = Person.getInstance();
        person1.setName("zhang");
        person2.setName("wang");
        person3.setName("li");
        person4.setName("zhao");

        System.out.println(person1.getName());
        System.out.println(person2.getName());
        System.out.println(person3.getName());
        System.out.println(person4.getName());
    }
}

输出:

Connected to the target VM, address: ‘127.0.0.1:52622‘, transport: ‘socket‘
zhao
zhao
zhao
zhao
Disconnected from the target VM, address: ‘127.0.0.1:52622‘, transport: ‘socket‘

Process finished with exit code 0

2.懒汉式

public class LazyPerson {

    private static LazyPerson lazyPerson;

    private String name;

    /**
     * 构造函数私有化
     */
    private LazyPerson(){

    }

    /**
     * 优点:
     *     避免了饿汉式的那种在没有用到的情况下创建事例,资源利用率高,不执行getInstance()就不会被实例,可以执行该类的其他静态方法。
     * 缺点:
     *      第一次加载时反应不快,由于java内存模型一些原因偶尔失败
     * @return
     */
    public static LazyPerson getInstance(){
        if(lazyPerson==null){
            //锁住对象
            synchronized (LazyPerson.class){
                if (lazyPerson==null){
                    lazyPerson=new LazyPerson();
                }
            }
        }
        return lazyPerson;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

测试方法

public class SingletonTest
{
    public static void main( String[] args )
    {
//        Person person1 = Person.getInstance();
//        Person person2 = Person.getInstance();
//        Person person3 = Person.getInstance();
//        Person person4 = Person.getInstance();

        LazyPerson person1 = LazyPerson.getInstance();
        LazyPerson person2 = LazyPerson.getInstance();
        LazyPerson person3 = LazyPerson.getInstance();
        LazyPerson person4 = LazyPerson.getInstance();
        person1.setName("zhang");
        person2.setName("wang");
        person3.setName("li");
        person4.setName("zhao");

        System.out.println(person1.getName());
        System.out.println(person2.getName());
        System.out.println(person3.getName());
        System.out.println(person4.getName());
    }
}

执行结果

Connected to the target VM, address: ‘127.0.0.1:53066‘, transport: ‘socket‘
Disconnected from the target VM, address: ‘127.0.0.1:53066‘, transport: ‘socket‘
zhao
zhao
zhao
zhao

Process finished with exit code 0

原文地址:https://www.cnblogs.com/smallTiger123/p/10634159.html

时间: 2024-10-29 20:53:21

(一)设计模式系列---单例模式的相关文章

深入浅出设计模式系列 -- 单例模式

注:本文出自博主:chloneda 前言 深入浅出设计模式系列,尽量采用通俗易懂.循序渐进的方式,让大家真正理解设计模式的精髓! 单例模式知识点 在开始讲解单例模式之前,先了解一下单例模式的知识点. 单例模式定义:确保一个类只有一个自行实例化的实例,并提供一个全局访问点,向整个系统提供这个实例. 模式类型:创建类模式 单例模式类图: 单例模式可以简单总结为三个要素: 私有的构造方法. 提供私有的.静态的.指向当前实例的引用. 提供公有的.静态的方法 即全局访问点以返回这个实例. 单例模式的本质:

从源码中学习设计模式系列——单例模式序/反序列化以及反射攻击的问题(二)

一.前言 这篇文章是学习单例模式的第二篇,之前的文章一下子就给出来看起来很高大上的实现方法,但是这种模式还是存在漏洞的,具体有什么问题,大家可以停顿一会儿,思考一下.好了,不卖关子了,下面我们来看看每种单例模式存在的问题以及解决办法. 二.每种Singleton 模式的演进 模式一 public class LazySingleton { private static LazySingleton lazySingleton = null; private LazySingleton() { }

Android设计模式系列-单例模式

单例模式,可以说是GOF的23种设计模式中最简单的一个. 这个模式相对于其他几个模式比较独立,它只负责控制自己的实例化数量单一(而不是考虑为用户产生什么样的实例),很有意思,是一个感觉上很干净的模式,本人很喜欢这个模式.android中很多地方都用到了单例模式,本文以输入法管理者InputMethodManager为例,展开分析.单例模式,Singleton Pattern,能够以其特有的优势,替代系统中全局变量,应用非常广泛. 1.意图保证一个类仅有一个实例,并提供一个访问它的全局访问点.热门

23种设计模式系列之单例模式

本文继续介绍23种设计模式系列之单例模式. 概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器

Java 设计模式系列(五)单例模式

Java 设计模式系列(五)单例模式 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 一.懒汉式单例 /** * 懒汉式单例类.在第一次调用的时候实例化自己 * 1. 构造器私有化,避免外面直接创建对象 * 2. 声明一个私有的静态变量 * 3. 创建一个对外的公共静态方法访问该变量,如果没有变量就创建对象 */ public class Singleton { private Singleton() throws InterruptedException { Thre

[js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表

所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理,由主板,电源,内存条,显卡, 机箱,显示器,外设等组成的 把一个成型的产品组成部件,分成一个个独立的部件,这种方式可以做出很多灵活的产品,这就是组合模式的优势 比如:家用台式机电脑,要求配置比较低, 这个时候只需要主板+电源+内存条+机箱+显示器+外设就可以了,不需要配置独立显卡 鸡腿堡+鸡翅+紫薯

[转]JAVA设计模式之单例模式

原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话

设计模式系列(二)原型模式

在设计模式系列(一)单例模式 中详细介绍了单例设计模式,下面一起来看一下原型模式. 一.概述 原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的. 原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据. 二.深拷贝和浅拷贝 原型模式中的拷贝分为"浅拷贝"和"深拷贝": 浅拷贝: 对值类型的

JAVA设计模式之单例模式(转)

本文继续介绍23种设计模式系列之单例模式. 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器