单例模式

Spring工厂模式+单例实现解耦

大憨熊 提交于 2020-03-09 04:41:35
1。BeanFactory 实现解决三层架构new之间的依赖 package bean; import org.springframework.beans.factory.BeanFactory; import javax.xml.ws.soap.Addressing; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Properties; public class FactoryBean { //定义一个Properties private static Properties prop; //定义一个Map,存放所创建的对象 private static Map<String ,Object> beans; //使用静态代码块 static{ try { //1.实例化对象 prop=new Properties(); //2.获取流对象 InputStream in= BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties"); prop

Python new方法与单例模式

左心房为你撑大大i 提交于 2020-03-09 00:53:19
在网上看了很多关于 __new__() 魔法方法的教程,毫无疑问大部分都是单例模式相关,确实如此,利用 __new__() 魔法方法的特性,在 Python 中很容易实现单例模式。 在面向对象编程的语言中,很多语言都有一个构造函数,例如 Java 和 C++ ,在 Python中 也存在一个构造函数 __init__() ,不过在 python 中叫做魔法方法,在类实例化的时候初始化类成员变量。运行下面的程序将会打印 init 字符串。 class test : def __init__ ( self ) : print ( 'init' ) if __name__ == '__main__' : a = test ( ) #程序输出 #init 刚开始学习 Python 的时候我觉得在类实例化的过程中第一运行的就是 __init__() 方法,后来发现还有一个比它先运行的魔法方法 __new__() 方法,运行下面的代码可以看到确实如此。 class test : def __init__ ( self ) : print ( 'init' ) def __new__ ( cls , * args , ** kwargs ) : print ( 'new' ) if __name__ == '__main__' : a = test ( ) #程序输出 #new 但是。。。

设计模式学习笔记-单例模式

核能气质少年 提交于 2020-03-08 16:37:09
概述: 单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但他不能防止你实例化多个对象,一个最好的办法就是,让这个类自身保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问改实例的方法。 适用场合: 1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 2.当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。 类图: 代码示例: class Singleton{ private static Singleton instance; //构造方法让它私有化,这样外界就不能通过 new 来实例化了 private Singleton() {} public static Singleton GetInstance() { if(null==instance) { instance = new Singleton(); } return instance; }}  前台调用测试 static void Main(string[] args){ Singleton s1= Singleton.GetInstance(); Singleton s2=Singleton.GetInstance(); if(s1==s2) {

单例模式

雨燕双飞 提交于 2020-03-08 10:35:39
单例模式 作用:保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象 应用场景: 1.资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。 2.控制资源的情况下,方便资源之间的互相通信。如线程池等。 3.设备管理器,系统中可能有多个设备,但是只有一个设备管理器,用于管理设备驱动; 基础要点: 全局只有一个实例:static 特性,同时禁止用户自己声明并定义实例(把构造函数设为 private) 线程安全 禁止赋值和拷贝 用户通过接口获取实例:使用 static 类成员函数 实现方式: 1.有缺陷的懒汉式: 懒汉式(Lazy-Initialization)的方法是直到使用时才实例化对象,也就说直到调用get_instance() 方法的时候才 new 一个单例的对象。好处是如果被调用就不会占用内存。 class Singleton { private : Singleton ( ) { std :: cout << "constructor called!" << std :: endl ; } Singleton ( Singleton & ) = delete ; Singleton & operator = ( const Singleton & ) = delete ; static Singleton * m

实现单例模式的几种方法

淺唱寂寞╮ 提交于 2020-03-08 04:33:21
单例模式(singleton): 某些类在进程的运行过程,只需要一个对象,不允许创建多个对象出来 如何写单例模式: 1.饿汉模式——一开始就创建好对象 class Singleton { private static Singleton instance = new Singleton ( ) ; private Singleton ( ) { } public static Singleton getInstance ( ) { return instance ; } } 2.懒汉模式——用到时再创建对象 1)线程不安全的懒汉模式 public class Singleton { private static Singleton instance ; private Singleton ( ) { } public static Singleton getInstance ( ) { if ( instance == null ) { instance = new Singleton ( ) ; } return instance ; } } 多线程时,线程不安全。——加锁,将方法加锁 2)双重锁的懒汉模式 class Singleton { private static volatile Singleton instance = null ; private Singleton

23种设计模式

删除回忆录丶 提交于 2020-03-08 04:28:39
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。本章系 Java之美[从菜鸟到高手演变]系列 之设计模式,我们会以理论与实践相结合的方式来进行本章的学习,希望广大程序爱好者,学好设计模式,做一个优秀的软件工程师! 企业级项目实战(带源码)地址 : http://zz563143188.iteye.com/blog/1825168 23种模式java实现源码下载地址 http://pan.baidu.com/share/link?shareid=372668&uk=4076915866#dir/path=%2F%E5%AD%A6%E4%B9%A0%E6%96%87%E4%BB%B6 一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式

设计模式——单例模式

≡放荡痞女 提交于 2020-03-07 04:14:59
关于单例模式,这是面试时最容易遇到的问题。当时以为很简单的内容,深挖一下,也可以关联出类加载、序列化等知识。 饿汉式 我们先来看看基本的饿汉式写法: public class Hungry { private static final Hungry instance = new Hungry(); private Hungry() {} public Hungry getInstance() { return instance; } } 优点:写法简答,不需要考虑多线程等问题。 缺点:如果该实例从未被用到的话,相当于资源浪费。 static 代码块 我们也可以用 static 代码块的方式,实现饿汉式: public class Hungry { private static final Hungry instance; static { instance = new Hungry(); } private Hungry() {} public Hungry getInstance() { return instance; } } 这就是利用了 static 代码块的功能: 它是随着类的加载而执行,只执行一次,并优先于主函数。 懒汉式 我们先来看看基本的懒汉式写法: public class Lazy { private static volatile Lazy instance;

设计模式学习(二)

懵懂的女人 提交于 2020-03-06 20:48:41
一、单例模式 单例模式分为以下8种: 饿汉式: 静态常量 静态代码块 懒汉式: 线程不安全 线程安全,同步方法 线程安全,同步代码块 双重检查 静态内部类 枚举 单例模式的使用场景: 需要频繁创建和销毁的对象;创建时耗时过多或消耗资源过多,但又经常用到的对象(比如session工厂、数据源等) (1)饿汉式 - 静态常量写法 代码实现: /** * 设计模式之单例模式 * 饿汉式(静态常量) * * @author song * @create 2020/3/4 15:08 */ public class SingletonTest01 { public static void main(String[] args) { Singleton instance1 = Singleton.getInstance(); Singleton instance2 = Singleton.getInstance(); System.out.println("两次获取的实例一样吗:" + (instance1 == instance2)); //true } } class Singleton { //私有构造方法,使其不可在外部通过构造器实例化 private Singleton() { } //定义为常量,保证实例对象不变 private final static Singleton

设计模式--1.单例设计模式

自作多情 提交于 2020-03-04 12:29:06
设计模式:之前别人总结的一套解决特定问题的较优代码 。 单例设计模式: 1.作用: 在应用程序中保证最多只能有一个实例。 2.好处: 2.1 提升运行效率(就一个对象,当再次使用该对象时,就不用再去new了,即不用再次重新进行类加载过程,把该对象的地址取到就行了) 2.2 可以实现数据共享 (示例:application对象,该对象的有效范围:从tomcat开启到关闭,当使用setAttribute(key,value)设置一个数据时,该数据就一直处于共享状态,通getAttribute(key)来获取,application对象在tomcat启动时创建,可以通过getServletContext()来获取) 3.懒汉式 3.1 对象只有被调用时才去创建 3.2 示例代码 package singleton ; /** * 懒汉式:对象只有被调用时才去创建对象 * @author YJL */ public class LazySingleTon { /** * 由于属性需要被静态方法调用,则把属性设置为static */ private static LazySingleTon singleTon ; /** * 1.构造方法特点: * 方法名和类名相同 * 无返回值 * 2.构造器私有化: * 是为了其它类不能实例化这个类对象 * 3.为了可以获取该对象 *

介绍下单例模式并且说下单例懒汉式和饿汉式的区别?

安稳与你 提交于 2020-03-04 06:26:48
单例的介绍: 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 主要解决:一个全局使用的类频繁地创建与销毁。 何时使用:当您想控制实例数目,节省系统资源的时候。 如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。 关键代码:构造函数是私有的。 应用实例: 一个班级只有一个班主任。 Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。 一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。 优点: 在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 避免对资源的多重占用(比如写文件操作)。 缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。 使用场景: 要求生产唯一序列号。 WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。 创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。 注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。 懒汉