单例模式(Singleton Patten)

顾名思义,单例模式就是只有一个实例,不管怎样,使用了单例模式的类在系统中只有一个对象被访问到。Java中单例模式定义:“一个类有且仅有一个实例,并且这个类会自行实例化,实例化时候的对象可以提供给整个系统。”

动机: 对于系统中的某些类来说,只有一个实例是很重要的,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。

实现过程:

显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例

,就是以下三点:

1、单例模式的类只提供私有的构造函数(通过控制构造函数来显示类的实例的生成过程 构造函数私有化 只能有本类来创建本类的实例)

2、类定义中含有一个该类的静态私有对象的引用private static 单例类的引用名=new 单例类的方法( );这种构造模式下仅仅在这个部分执行了一次构造函数。

3、该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象。(这个相当于提供给外部的一个方法 通过这个方法 可以获得这个类的实例)

因为是static的 该类对象只有一个实例,不会没new一次该实例,又因为构造函数是私有的,在定义类的时候已经生成了单一的实例变量。只能通过 Classname.单例类的引用名 这样的方式来访问这个实例变量 无法再生成新的实例变量了(构造函数私有),又因为是私有的,仅仅能通过共有的函数入口来进行访问,外部的类无法对该实例进行修改。

内在的逻辑思路:

要求只能生成一个实例—>将构造函数私有化—>保证外部的程序无法通过new来产生新的实例对象—>在外部无法生成实例对象—>没法通过对象来调用实例方法—>只能通过类方法来返回一个实例对象—>静态方法只能访问静态属性—>所以在类内部生成的实例属性也要是static类型的

三个关键点:

1、构造函数私有

2、静态成员变量引用自身类的实例对象

3、向外部提供getinstance函数来访问内部的static实例

具体代码如下:

package com.designpatten.SingletonPatten;

/*

* 实现了一个单例模式

*/

public class SingletonPatten {

//初始化函数

private SingletonPatten()

{

System.out.println("creat a new instance");

}

private int number=0;

private static SingletonPatten singlepatten=new SingletonPatten();

public int getNumber() {

return number;

}

public void setNumber(int number) {

this.number = number;

}

public static SingletonPatten getinstance(){

System.out.println("evoke the instance");

//注意调用私有static属性的时候不用加this 因为static属性属于整个类

return singlepatten;

}

}

/*

* 可以看出来 仅仅有一个实例 调用了一次构造函数creat a new instance (仅仅被调用了一次)

* 虽然每次都生成了新的实例 但是只有一个实例

*/

public class Test {

public static void main (String[]args)

{

SingletonPatten s1=SingletonPatten.getinstance();

System.out.println(s1.getNumber());

s1.setNumber(1);

SingletonPatten s2=SingletonPatten.getinstance();

System.out.println(s2.getNumber());

s2.setNumber(2);

SingletonPatten s3=SingletonPatten.getinstance();

System.out.println(s3.getNumber());

System.out.println(s1==s2);

System.out.println(s2==s3);

}

}

执行结果:

creat a new instance

evoke the instance

0

evoke the instance

1

evoke the instance

2

true

true

可以看出来 s1 s2 s3三个引用指向的是相同的地址空间,仅仅生成了一个实例。

时间: 2024-10-25 11:21:54

单例模式(Singleton Patten)的相关文章

单例模式Singleton – 学习HeadFirst设计模式记录

单件模式:确保一个类只有一个实例,并提供一个全局访问点. 1.单例模式实现 #include <windows.h>#include <iostream> class Singleton{public:    static Singleton* GetInstance()  /* 单例全局访问点 */    {        if (NULL == _pUniqueInstance) /* 延迟初始化.若使用立刻创建方式,就不会有多线程问题,但是程序启动后就会占用资源. */   

.Net 单例模式(Singleton)

每台计算机可以有若干个打印机,但只能有一个Printer Spooler, 以避免两个打印作业同时输出到打印机中.每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况.每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用. 问题描述: 单例模式 Singleton Pattern 问题解决: (1)单例模式简介: Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这

单例模式——Singleton

模式分类: 从目的来看: 1.创建型(Creational)模式:负责对象创建. 2.结构型(Structural)模式:处理类于对象间的组合. 3.行为型(Behavioral)模式:类与对象交互中的职责分配. 从范围看: 1.类模式处理类于子类的静态关系. 2.对象模式处理对象间的动态关系. 动机 在软件系统中,经常有一些这样特殊的类,必须保证他们在系统中只存在一个实例,才能确保他们的逻辑正确性.以及良好的效率. 绕过常规的构造器,提供一种机制保证一个类只有一个实例. 意图 保证一个类仅有一

【白话设计模式四】单例模式(Singleton)

转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二]外观模式(Facade) [白话设计模式三]适配器模式(Adapter) [白话设计模式四]单例模式(Singleton) [白话设计模式五]工厂方法模式(Factory Method) [白话设计模式六]抽象工厂模式(Abstract Factory) [白话设计模式七]策

php设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 谷歌的Android设备 华为的Android设备 IOS只属于苹果公司 IOS只属于苹果公司 1 <?php 2 3 /* 4 * php

设计模式之——单例模式(Singleton)的常见应用场景(转):

单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此有些设计大师并把把其称为设计模式之一. 这里又不具体讲如何实现单例模式和介绍其原理(因为这方便的已经有太多的好文章介绍了),如果对单例模式不了解的可以先看下:http://terrylee.cnblogs.com/archive/2005/12/09/293509.html . 好多没怎么使用过的人

Android - 单例模式(singleton)的使用

单例模式(singleton)的使用 本文地址:http://blog.csdn.net/caroline_wendy 单例(singleton)是特殊的Java类,在创建实例时,一个类仅允许创建一个实例. 应用能够在内存里存多久,单例就能存在多久,因此将对象列表保存在单例里可保持crime数据的一直存在, 不管activity.fragment及它们的生命周期发生什么变化. 要创建单例,需创建一个带有私有构造方法及get()方法类,其中get()方法返回实例. 如实例已存在,get()方法则直

二十四种设计模式:单例模式(Singleton Pattern)

单例模式(Singleton Pattern) 介绍保证一个类仅有一个实例,并提供一个访问它的全局访问点. 示例保证一个类仅有一个实例. Singleton using System; using System.Collections.Generic; using System.Text; namespace Pattern.Singleton { /// <summary> /// 泛型实现单例模式 /// </summary> /// <typeparam name=&q

Java 设计模式 单例模式(Singleton) [ 转载 ]

Java 设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创建对象 第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton (){} 4 5 public static Singleton getInstan

Android设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import