单例模式

java|设计模式详解(最全)

和自甴很熟 提交于 2019-11-27 01:25:02
一、设计模式的分类 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 (2)结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 (3)行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。用一个图片来整体描述一下: 二、设计模式的六大原则 1、开闭原则(Open Close Principle) 开闭原则就是说 对扩展开放,对修改关闭 。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。 2、里氏代换原则(Liskov Substitution Principle) 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为

<人人都懂设计模式>-单例模式

强颜欢笑 提交于 2019-11-27 00:19:16
这个模式,我还是了解的。 书上用了三种不同的方法。 class Singleton1: # 单例实现方式1 __instance = None __is_first_init = False def __new__(cls, name): if not cls.__instance: Singleton1.__instance = super().__new__(cls) return cls.__instance def __init__(self, name): if not self.__is_first_init: self.__name = name self.__is_first_init = True def get_name(self): return self.__name tony = Singleton1('Tony') karry = Singleton1('karry') print(tony.get_name(), karry.get_name()) print(id(tony), id(karry)) print(tony == karry) print("=======单例实现方式1========") class Singleton2(type): # 单例实现方式2 def __init__(cls, what, bases=None, dict

设计模式之单例模式

浪尽此生 提交于 2019-11-27 00:10:52
作用:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 UML结构图: 上面提到的单例模式的两个作用在C++中通过如下机制实现:1)仅有一个实例,提供一个例的静态成员变量,大家知道类的静态成员变量对于一个类的所有的对象而言是唯一的。但是这样还不能保证类只有一个实例,还应该把类的构造函数设为私有。这样就不能在类外实例化这个类了。2)提供一个访问它的全局访问点,也就是提供对应的访问这个静态成员变量的静态成员函数,对类的所有对像而言也是唯一的。在C++中可以直接使用类域进行访问而不必初始化一个类的对象。 参考代码: /*********************************************************************************** * file name : Singleton.h * created : 2012/01/03 * author : Gavin XLX * description: * version: 1.0 * update: *************************************************************************************/ #ifndef __SINGLETON_H #define __SINGLETON_H class

单例模式

你。 提交于 2019-11-27 00:05:20
一、内容 保证一个类只有一个实例,并提供一个访问它的全局访问点 二、角色 单例 三、使用场景 当类只有一个实例而且客户可以从一个众所周知的访问点访问它时 比如:数据库链接、Socket创建链接 四、优点 对唯一实例的受控访问 单利相当于全局变量,但防止了命名空间被污染 与单利模式功能相似的概念:全局变量、静态变量(方法) 试问?为什么用单例模式,不用全局变量呢?   答、全局变量可能会有名称空间的干扰,如果有重名的可能会被覆盖 五、单例模式的四种实现方式 1、文件导入的形式(常用) s1.py class Foo(object): def test(self): print("123") v = Foo() #v是Foo的实例 s2.py from s1 import v as v1 print(v1,id(v1)) #<s1.Foo object at 0x0000000002221710> 35788560 from s1 import v as v2 print(v1,id(v2)) #<s1.Foo object at 0x0000000002221710> 35788560 # 两个的内存地址是一样的 # 文件加载的时候,第一次导入后,再次导入时不会再重新加载 2、基于类实现的单例模式 # ======================单例模式:无法支持多线程情况=====

单例模式

家住魔仙堡 提交于 2019-11-26 23:27:53
单例(单独的实例,均是Object的实例,但互不干扰) //这是一个人的一些基本特征 var name = "hh”; var age = 3; var sex = "man" //==>将描述同一事物的属性或者特征进行分组归类,(存储在同一空间下)避免了全局变量之间的冲突*/ var obj = { name:'hh', age:3, sex:'man' } /* 单例模式中,obj不仅仅是对象名,它也被称为“命名空间”,多个命名空间都是独立分开,无联系。 */ /*高级单例模式:不直接赋给一个对象,不执行匿名函数,创建一个私有作用域(不销毁的栈内存),在AA中创建一个堆内存,将地址赋给命名空间. 好处:我们可以在AA中创建很多内容(供外部使用),我们暴露到返回的对象中。(需要谁暴露谁,模块化的一种思想) */ /* var nameSpace = (function(){ var n = 12; function fn(){ return {fn:fn} }//私有域AA })() */ 来源: https://www.cnblogs.com/angle-xiu/p/11335182.html

java设计模式——单例模式

南楼画角 提交于 2019-11-26 22:44:06
  对于一个软件系统中的某些类而言,只有一个实例是很重要的。单例模式 (Singleton) 是结构最简单的设计模式,它的核心结构中只包含一个被称为单例类的特殊类。单例模式是一种对象创建型模式。实现单例模式有 3 个要点: 某个类只能有一个实例 它必须自行创建这个实例 它必须自行向整个系统提供这个实例   单例模式 (Singleton) 定义:确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。 单例模式实现   对于单例模式 (Singleton) ,在单例类的内部创建它的唯一实例,并通过静态方法 getInstance() 让客户端可以使同它的唯一实例;为了防止在外部对单例类实例化,将其构造函数的设置为 private ;在单例类内部定义一个 Singleton 类型的静态对象作为供外部共享访问的唯一实例。   在单例模式的实现过程中需要注意以下 3 点:   (1) 单例类的构造函数的访问权限为 private   (2) 提供一个类型为自身的静态私有成员变量   (3) 提供一个公有的静态工厂方法。 一、饿汉式单例   饿汉式单例类中定义了一个静态变量,当类被加载时,静态变量就会被初始化,此时类的私用构造函数会被调用,单例类的唯一实例将被创建。代码: public class EagerSingleton { private static final

23种设计模式(1):单例模式

牧云@^-^@ 提交于 2019-11-26 21:41:23
定义: 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 类型: 创建类模式 类图: 类图知识点: 1.类图分为三部分,依次是类名、属性、方法 2.以<<开头和以>>结尾的为注释信息 3.修饰符+代表public,-代表private,#代表protected,什么都没有代表包可见。 4.带下划线的属性或方法代表是静态的。 5.对类图中对象的关系不熟悉的朋友可以参考文章: 设计模式中类的关系 。 单例模式应该是23种设计模式中最简单的一种模式了。它有以下几个要素: 私有的构造方法 指向自己实例的私有静态引用 以自己实例为返回值的静态的公有的方法 单例模式根据实例化对象时机的不同分为两种:一种是饿汉式单例,一种是懒汉式单例。饿汉式单例在单例类被加载时候,就实例化一个对象交给自己的引用;而懒汉式在调用取得实例方法的时候才会实例化对象。代码如下: 饿汉式单例 1 2 3 4 5 6 7 public class Singleton { private static Singleton singleton = new Singleton ( ) ; private Singleton ( ) { } public static Singleton getInstance ( ) { return singleton ; } } 懒汉式单例 1 2 3 4 5 6 7 8 9

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

南笙酒味 提交于 2019-11-26 20:28:15
单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此有些设计大师并把把其称为设计模式之一。 这里又不具体讲如何实现单例模式和介绍其原理(因为这方便的已经有太多的好文章介绍了),如果对单例模式不了解的可以先看下: http://terrylee.cnblogs.com/archive/2005/12/09/293509.html 。当然也可以 自己搜索 。 好多没怎么使用过的人可能会想,单例模式感觉不怎么用到,实际的应用场景有哪些呢?以下,我将列出一些就在咱们周边和很有意义的单例应用场景。 1. Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~ 2. windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中 ,回收站一直维护着仅有的一个实例。 3. 网站的计数器,一般也是采用单例模式实现,否则难以同步。 4. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。 5.

C# 单例模式Lazy<T>实现版本

ぐ巨炮叔叔 提交于 2019-11-26 20:28:05
非Lazy版本的普通单例实现: public sealed class SingletonClass : ISingleton { private SingletonClass () { // the private contructors } public static ISingleton Instance { get { if (instance == null ) { lock (InstanceLock) { if (instance != null ) { return instance; } instance = new SingletonClass(); } } return instance; } } private static ISingleton instance; private static readonly object InstanceLock = new object (); private bool isDisposed; // other properties public void Dispose() { this .Dispose( true ); GC.SuppressFinalize( this ); } private void Dispose( bool disposing) { if (! this .isDisposed) {

创建型模式之单例模式(2.1)

爱⌒轻易说出口 提交于 2019-11-26 18:03:54
单例模式定义 在软件系统中,一个类只有一个实例对象。(该类只提供一个取得实例的静态方法) 推荐使用的三种单例模式 DoubleCheck 静态内部类 枚举 1.DoubleCheck 双重检查 特点:效率高,线程安全,延迟加载。 class DoubleCheck { private static volatile DoubleCheck instance; private DoubleCheck(){} public static DoubleCheck getInstance() { /* DoubleCheck如何实现?线程安全和效率提升 在多线程的环境下,假设线程A直接进入#2,实例化对象。 且实例化方法外用synchronized修饰,所以是线程安全的。 当线程A实例化对象结束,对象instance已经被创建,执行到#1的线程将会直接调到#3,返回instance 且DoubleCheck实现了延迟加载(new在方法里) */ if(instance==null) //#1 { synchronized (DoubleCheck.class) //#2 { if(instance==null) { instance = new DoubleCheck(); //#3 } } } return instance; } } public class Operation {