单例模式

设计模式之单例模式

南楼画角 提交于 2020-03-24 16:42:42
单例模式 1、定义: 单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。 2、特点: 单例类只有一个实例对象; 该单例对象必须由单例类自行创建; 单例类对外提供一个访问该单例的全局访问点; 3、应用场景 在应用场景中,某类只要求生成一个对象的时候,如一个班中的班长、每个人的身份证号等。 当对象需要被共享的场合。由于单例模式只允许创建一个对象,共享该对象可以节省内存,并加快对象访问速度。如 Web 中的配置对象、数据库的连接池等。 当某类需要频繁实例化,而创建的对象又频繁被销毁的时候,如多线程的线程池、网络连接池等。 4、PHP 单例模式的实现: 单例模式是设计模式中最简单的模式之一。通常,普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。 但是,如果将类的 构造函数设为私有 的,外部类就无法调用该构造函数,也就无法生成多个实例。这时该类自身必须定义一个 静态私有实例 ,并向外提供一个 静态的公有函数 用于创建或获取该静态私有实例。 简单记作:三私一公: 私有的构造方法:外部无法调用,也就无法生成多个实例 私有的克隆方法:防止克隆 私有的静态属性:存储唯一实例化的对象 公有的静态方法:实例化该类本身 代码: <?php class Single{ //私有的静态属性 private static $

设计模式-单例模式(Singleton Pattern)

核能气质少年 提交于 2020-03-24 09:57:44
1、介绍:    单例模式(Singleton Pattern): 所谓单例,就是整个程序有且仅有一个实例。该类负责创建自己的对象,同时确保只有一个对象被创建。 场景: 频繁创建对象、管理对象是一件耗费资源的事,可以使用单例模式。 2、特点 类构造器私有 持有自己类型的属性 对外提供获取实例的静态方法 3、实现方式   编写单例模式的代码其实很简单,就分了三步: 将构造函数私有化(禁止 new 对象) 在类的内部创建实例 提供获取唯一实例的方法 第一种(懒汉,线程不安全): public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 第二种(懒汉,线程安全): public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance

7 种单例模式设计

时间秒杀一切 提交于 2020-03-24 03:32:59
饿汉式 // final 不允许被继承 public final class Singleton { // 饿汉式,先new private static Singleton singleton = new Singleton(); // 私有构造不允许外部 new private Singleton(){ } public static Singleton getInstance(){ return singleton; } } 饿汉式的问题是 instance 在被 ClassLoader加载后很长时间才能在使用,如果类中的资源是重资源,那么就必须使用懒汉式 懒汉式 // final 不允许被继承 public final class Singleton { // 饿汉式,先new private static Singleton singleton = null; // 私有构造不允许外部 new private Singleton(){ } public static Singleton getInstance(){ if (singleton == null){ singleton = new Singleton(); } return singleton; } } 问题是多线程下不能保证实例的唯一性。 懒汉式+ 同步 // 但是 只允许一个 线程 访问这个方法

单例模式

故事扮演 提交于 2020-03-23 14:03:11
单例模式,顾名思义,整个代码只有一个。如类。如果采用单例模式,则需要在静态数据区域上分配个内存,提供给整个程序。他得自己创建整个类实例。 单例模式的使用步骤: a) 构造函数私有化。// 为不让在类的外部再创建一个本类的实例 b) 提供一个全局的静态方法(全局访问点)来获取单例对象。 c) 在类中定义一个静态指针,指向本类的变量的静态变量指针 。 例子如下所示 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; /* class A { public: private: A() { } }; */ /* 一是某个类只能有一个实例; 二是它必须自行创建这个实例; 三是它必须自行向整个系统提供这个实例。 */ /* 单例模式的使用步骤: a) 构造函数私有化。// 为不让在类的外部再创建一个本类的实例 b) 提供一个全局的静态方法(全局访问点)来获取单例对象。 c) 在类中定义一个静态指针,指向本类的变量的静态变量指针 。 */ class Singleton { public: static Singleton* getInstance() { return instance; } private: //不让类的外部再创建实例 Singleton() { } static Singleton

C#单例模式

南楼画角 提交于 2020-03-22 00:02:47
1、定义 单例模式是确保一个类只有一个实例,并提供一个全局访问方式的设计方法 2、UML类图 3、应用场景 需要频繁实例化然后销毁的对象。 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。 有状态的工具类对象。 频繁访问数据库或文件的对象。 4、C#实现单例模式 4.1 单线程单例模式 代码解析: Singleton的构造函数必须是私有的,确保外层无法通过new进行实例化对象 静态变量的生命周期同应用程序的生命周期相同,可以定义一个私有的全局静态变量_instance来保存该类的唯一实例 提供一个可访问的静态方法访问类的实例,在该方法内通过判断_instance是否为null,如果是null就创建一个实例,否则向外部返回实例 4.2 多线程单例模式 1) lock方式 代码解析: 外层if判断_instance不为null时,直接返回实例,避免每次获取实例时进行锁定,节省了 性能损耗 当外层判断成功时,使用lock锁定,保证只创建一个实例 2) 静态构造函数 代码解析: 静态构造函数只会执行一次 3) 静态变量初始化 代码解析: 静态变量在初次运行时就会初始化,readonly确保变量运行时无法修改 来源: https://www.cnblogs.com/kun2008/p/6686362.html

设计模式

烂漫一生 提交于 2020-03-20 14:53:38
3 月,跳不动了?>>> 在软件工程中, 创建型模式 是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象。基本的对象创建方式可能会导致设计上的问题,或增加设计的复杂度。创建型模式通过以某种方式控制对象的创建来解决问题。 常用创建型模式有:单例模式、工厂模式、抽象工厂模式、原型模式、建造者模式 一、单例模式 单例模式有以下8种写法: 饿汉式: 静态常量 静态代码块 懒汉式: 线程不安全 线程安全,同步方法 线程安全,同步代码块 双重检查 静态内部类 枚举 单例模式的使用场景: 需要频繁创建和销毁的对象;创建时耗时过多或消耗资源过多,但又经常用到的对象(比如session工厂、数据源等) 1. 饿汉式 - 静态常量写法 代码实现: /** * 设计模式之单例模式 * 饿汉式(静态常量) */ public class SingletonTest01 { public static void main(String[] args) { Singleton instance1 = Singleton.getInstance(); Singleton instance2 = Singleton.getInstance(); System.out.println("两次获取的实例一样吗:" + (instance1 == instance2)); //true } } class

Python下简易的单例模式详解(转)

狂风中的少年 提交于 2020-03-18 03:48:10
Python 下的单例模式 要点: 1.某个类只能有一个实例; 2.它必须自行创建这个实例; 3.它必须自行向整个系统提供这个实例 方法:重写new函数 应该考虑的情况: 1.这个单例的类可能继承了别的类 2.这个单例的类还有可能要接收参数来实例化 要点: 实例化的过程其实不是直接调用init的,首先是new分配一块空间来创建实例,再由init对这个实例进行初始化.我们无法阻止new和init的调用,我们只能是限制他们的内容,以此使他们能达到单例的目的 代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 class people( object ): def __new__( cls , * args, * * kargs): return super (people, cls ).__new__( cls ) def __init__( self ,name): self .name = name def talk( self ): print ( "hello,I am %s" % self .name) class student(people): def __new__( cls , * args, * * kargs): if not hasattr ( cls ,

c# 设计模式之单例模式(双if +lock)

梦想与她 提交于 2020-03-17 12:34:54
public class Singleton { private static Singleton _Singleton = null; private static object Singleton_Lock = new object(); public static Singleton CreateInstance() { if (_Singleton == null) //双if +lock { lock (Singleton_Lock) { Console.WriteLine("路过。"); if (_Singleton == null) { Console.WriteLine("被创建。"); _Singleton = new Singleton(); } } } return _Singleton; } } 来源: https://www.cnblogs.com/25miao/p/12509523.html

单例模式

倾然丶 夕夏残阳落幕 提交于 2020-03-16 00:02:07
概述 保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。 三个要点: 一是某个类只能有一个实例; 二是它必须自行创建这个实例; 三是它必须自行向整个系统提供这个实例。 模式中的角色和职责 Singleton(单例): 在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()工厂方法,让客户可以访问它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有;在单例类内部定义了一个Singleton类型的静态对象,作为外部共享的唯一实例。 单例模式的使用步骤: a) 构造函数私有化。 b) 提供一个全局的静态方法(全局访问点)来获取单例对象。 c) 在类中定义一个静态指针,指向本类的变量的静态变量指针 。 单例模式的案例 1 #include <iostream> 2 using namespace std; 3 /* 4 懒汉模式 5 */ 6 class Singelton 7 { 8 public: 9 /* 10 对外提供⼀一个全局的静态⽅方法 11 */ 12 static Singelton * getInstance() { 13 /* 14 懒汉式: 在调⽤用全局静态⽅方法,获取单例的时候, 15 再进⾏行创建。懒汉式的单例创建在程序的执⾏行中进⾏行。 16 */ 17 if (instance == NULL) {

java 单例设计模式

六眼飞鱼酱① 提交于 2020-03-15 18:07:09
设计模式:解决某一类问题最行之有效的方法。 单例设计模式:解决一个类在内存中只存在一个对象。 想要保证对象唯一:   1.为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象   2.为了让其他程序访问该类对象,只好在本类中自定义一个对象   3.为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。 解决方法:   1.构造函数私有化   2.在类中创建类对象   3.提供一个方法可以获取该对象 第 1 种:饿汉式单例 class Single { private static Single s = new Single(); private Single() { } public static Single getInstance(){ return s; } } 第 2 种: 懒 汉式单例 class Single { private static Single s = null; private Single() { } public static Single getInstance(){ if (s == null){ synchronized (Single.class){ if (s == null) { s = new Single(); } } } return s; } } 推荐使用饿汉式 来源: https://www.cnblogs.com