单例模式

单例模式应用-- Timer 计时器

落花浮王杯 提交于 2019-11-27 08:46:36
Timer :计时器   一种工具: 线程用其安排以后再后台线程中执行的任务,可执行一次,也可执行多次   其中的方法: schedule( TimeTask task , Date date) 只执行一次         schedule(TimeTask task , Date date, time) 每隔多少时间 执行。重复执行多次     TimeTask类 实现了Runnable接口, 有一个抽象的Run()方法。 用TimeTask的子类对象当做参数传给schedule() import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class demon3_timer { public static void main(String[] args) throws InterruptedException { Timer t1 = new Timer(); t1.schedule(new MyTimerTask(), new Date(119, 7, 14, 23, 59, 30),5000); while (true) { Thread.sleep(1000); System.out.println(new Date()); } } } class

观察者模式,单例模式和工厂模式

谁都会走 提交于 2019-11-27 07:56:09
持续更新中... 观察者模式: ( https://blog.csdn.net/colinandroid/article/details/81113013 ) 观察者模式:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并自动更新。 Subject:就是“被观察”的角色,它将所有观察者对象的引用保存在一个集合中。 (1)保存注册的观察者对象 (2)注册观察者对象 (3)注销观察者对象 (4)通知所有注册的观察者对象 Observer:是抽象的“观察”角色,它定义了一个更新接口,使得在被观察者状态发生改变时通知自己。 ConcreteObserver:具体的观察者。 单例模式: ( https://blog.csdn.net/q_all_is_well/article/details/82377917 ) 实现特点: (1)私有化该类的构造函数 (2)通过new在本类中创建一个本类对象 (3)定义一个公有的方法,将在该类中所创建的对象返回 实现方法: (1)单例模式的饿汉式 (2)单例模式懒汉式双重校验锁 (3)内部类 工厂模式: ( https://blog.csdn.net/u012156116/article/details/80857255 ) 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类

设计模式-单例模式

你离开我真会死。 提交于 2019-11-27 07:40:12
饿汉式单例 // 缺点: 在类不使用时也会加载,浪费内存 class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } 同步单例 // 缺点:在类创建成功后其实不需要同步,性能低 class Singleton { private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 双重检查锁单例 // 缺点:写法复杂,仍需要同步 class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) {

08_如何编写一个程序测试单例模式是否是线程安全的?

我的梦境 提交于 2019-11-27 04:48:10
开启多个线程来分别获取单例,然后打印它们所获取到的单例的hashCode值。若它们获取的单例是相同的(该单例模式的实现是线程安全的),那么它们的hashCode值一定完全一致;若它们的hashCode值不完全一致,那么获取的单例必定不是同一个,即该单例模式的实现不是线程安全的,是多例的。 public class TestThreads extends Thread { @Override public void run ( ) { // 对于不同单例模式的实现,只要更改相应的单例类名及其公有静态工厂方法名即可 int hash = Singleton1 . getSingleton1 ( ) . hashCode ( ) ; System . out . println ( hash ) ; } } public class Test { public static void main ( String [ ] args ) { Thread [ ] threads = new Thread [ 10 ] ; for ( int i = 0 ; i < threads . length ; i ++ ) { threads [ i ] = new TestThreads ( ) ; } for ( int i = 0 ; i < threads . length ; i ++ )

常用的五种单例模式实现方式

北城余情 提交于 2019-11-27 02:27:21
单例模式的关键点 1) 构造方法不对外开放,为private 2) 确保单例类只有一个对象,尤其是多线程模式下 3) 通过静态方法或枚举返回单例对象 4) 确保单例类在反序列化是不会重新创建新的对象 单例模式的实现方式 1) 饿汉式 public class Singleton1 { /* * 饿汉式是在声明的时候就已经初始化Singleton1,确保了对象的唯一性 * * 声明的时候就初始化对象会浪费不必要的资源 * */ private static Singleton1 instance = new Singleton1(); private Singleton1() { } // 通过静态方法或枚举返回单例对象 public Singleton1 getInstance() { return instance; } } 2) 懒汉式 public class Singleton2 { private static Singleton2 instance; private Singleton2() { } /* * getInstance 添加了synchronized 关键字,,也就是说 getInstance 是一个同步方法, * 这就是懒汉式在多线程中保持唯一性的方式 * * 懒汉式存在的问题是,即是instance已经被创建

设计模式之单例模式

跟風遠走 提交于 2019-11-27 02:27:09
一.单例模式的定义 单例模式,是一种常用的设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。 二.单例模式的结构图 三.具体实现方法 (1)将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。 (2)在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型。 (3)定义一个静态方法返回这个唯一对象。 四.实现代码 //贪婪加载 class SingleTon { public: static SingleTon* getInstance() { return psingle; } private: SingleTon(){}//构造函数 SingleTon(const SingleTon&);//拷贝构造函数 static SingleTon* psingle; }; SingleTon* SingleTon::psingle = new SingleTon(); //懒汉模式 延时加载 class SingleTon { public: static SingleTon* getInstance() { if (psingle == NULL) { lock(); if (psingle == NULL) { psingle = new

C#单例模式

允我心安 提交于 2019-11-27 02:15:06
原文: C#单例模式 前言:单例模式是我们在软件开发中比较常用的模式之一,能很好的理解并运用对软件的性能是有很大的帮助的。 一、最简单的单例模式 public class Singleton { private static Singleton _instance = new Singleton(); private Singleton() { } public static Singleton GetInstance() { return _instance; } } View Code 点评:该种实现,在程序一运行就将对象加载到内存,由于静态变量是常驻于内存不会被GC回收,故该实例化方式适用于经常使用的对象。对象一开始就被实例化了所以在多线程环境下是线程安全的。 二、双重锁单例模式 public class Singleton { private static object obj = new object(); private static Singleton _singletion; private Singleton() { } public static Singleton Instance { get { if (_singletion == null) { lock (obj) { if (_singletion == null) { _singletion =

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

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

常用的设计模式

末鹿安然 提交于 2019-11-27 01:27:29
常用的设计模式有哪些?很多时候一时想不起来。因此编个顺口溜方便记忆。 组织(组合模式)经过观察(观察者模式),命令(命令者模式)我,找个代理(代理模式),建个工厂(工厂模式),生产单例产品(单例模式),然后迭代(迭代模式)检查所有的产品,不合格的产品要适配(适配器模式)一下。 转载于:https://www.cnblogs.com/nzbbody/archive/2012/08/24/2654145.html 来源: https://blog.csdn.net/weixin_30588907/article/details/99234397

单例模式

﹥>﹥吖頭↗ 提交于 2019-11-27 01:25:37
1、使用C#语言,比较简单,使用私有的构造方法和公有的静态方法返回静态实例。在C#中,赋值的时候,基本类型是整体拷贝,引用类型是复制引用。 2、使用C++语言,有几个地方需要注意:   a、编译器会自动生成copy构造方法和copy复制操作符,从而导致生成多个实例。为了解决这个问题,声明私有的copy构造方法和copy复制操作符,但是不定义。通过继承noncopyable是个好办法,noncopyable中声明了私有的copy构造和copy赋值,并且构造方法是protected。子类会继承父类的所有成员,只不过是不能访问父类的私有成员。   b、静态构造方法返回引用没有问题,如果返回指针,需要考虑什么时候释放内存。正确的做法是,RAII资源获取就初始化,使用share_ptr包装返回的实例指针。 3、在C#中 Person p = new Person(); 包括三个过程:①定义Person类型的变量,变量名为p;②在托管堆上分配一个Person对象;③变量p指向分配的Person对象。相对于C++,p是一个弱化的指针,强化的引用。为什么?   a、C++中的指针可以做加减操作,这里的p不可以;   b、C++中的引用必须初始化,而且不能指向其他对象,这里的p允许不初始化,同时可以指向其他对象。 4、语句 Person p;   在C++中,表达的意思是:在栈上定义对象