Singleton模式
常见设计模式及应用场景

常见设计模式及应用场景设计模式是一种解决特定问题的经验总结,可以提高代码的可重用性、可读性和灵活性。
在软件开发过程中,常见的设计模式有23种,下面将对其中的几种常见的设计模式及其应用场景进行介绍。
1. 单例模式(Singleton Pattern):单例模式用于限制一个类只能有一个实例,并提供一个全局访问点。
在需要频繁创建和销毁对象的场景下,可以使用单例模式来减少系统开销。
例如,在多线程环境下需要共享某个资源时,通过单例模式可以保证该资源只有一个实例。
2. 工厂模式(Factory Pattern):工厂模式用于创建对象,把实例化对象的过程封装在一个工厂类中。
它解耦了对象的创建和使用,提高了代码的可扩展性。
例如,一个电商平台上有多种类型的商品,可以通过工厂模式根据用户的选择来创建相应类型的商品。
3. 观察者模式(Observer Pattern):观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。
观察者模式适用于对象之间存在一种一对多的关系,并且对象之间需要保持一致。
例如,一个新闻发布系统中,当发布一条新闻时,系统需要通知所有订阅该新闻频道的用户。
4. 策略模式(Strategy Pattern):策略模式定义了一系列可以互相替换的算法,并根据具体情况选择合适的算法。
使用策略模式可以避免使用大量的if-else语句,提高代码的可维护性和扩展性。
例如,在一个电商平台中,根据会员等级的不同,可以采用不同的折扣策略来计算商品的价格。
5. 适配器模式(Adapter Pattern):适配器模式用于将两个不兼容的接口转换为可兼容的接口,使得不同的类可以协同工作。
适配器模式可以增强代码的复用性和灵活性。
例如,一个音频播放器只支持mp3格式的音乐文件,当我们需要播放其他格式的音乐文件时,可以使用适配器模式将不同格式的音乐文件转换为mp3格式。
6. 建造者模式(Builder Pattern):建造者模式可以将创建复杂对象的过程与表示分离,使得同样的创建过程可以创建不同的表示。
单子模型

设计模式感悟(二)--- 单例模式(Singleton Pattern)关键字: 设计模式感悟,单例模式单例模式是什么按照四人团的说法 Singleton 模式的意图是:保证一个类仅有一个实例,并且为该类提供一个的全局访问点。
也就是说你希望在你的应用程序或系统中,只存在唯一的该类的实例。
这句话隐含着两个意思:你不能通过一般情况下的 new 来创建和访问该实例,如果可以这样,那你 new 一下就会产生一个实例,那么从另一个方面来讲就是创建该类实例的责任要要由该类自己承担,这让我们想到了静态工厂方法(getInstance 之类获取当前类实例的方法);要提供一个全局访问点,既然不能自己 new 一个总要提供一个访问该唯一实例的方法,这让我们想到了类方法和类变量。
上述分析后,单例模式的意图和实现也就差不多有了轮廓了。
哪些场景需要单例模式1。
在资源管理方面的经常使用单例模式比如打印机的 Printer Spooler 是单例模式,这样可以避免两个作业同时输出到打印机;2。
从系统性能方面考虑使用单例模式实例的创建是需要消耗系统资源的,而且是费时的,重复的对象最后还需要垃圾回收器回收,更是加重了系统的负担。
如何实现单例模式在设计单例模式的时候,首先要确定何时实例化该类的实例。
第一种选择是将该单例对象作为单例类的一个静态域实例化。
示例如下:Java代码1.package com.zhaipuhong.designpattern;2.3.public class Singleton {4.private static Singleton singleton = newSingleton(); //私有的本单例类的静态域5.6./**7.* 私有的构造方法,阻止了用户通过此构造方法直接创建实例8.*/9.private Singleton(){}10.11.public Singleton getInstance(){12.return singleton;13.}14.}第二种情况,如果不希望提前创建单例对象,可以等到第一次使用该单例对象的时候再创建它。
写一个简单的单例模式

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

Singleton模式在软件开发中的应用分析与实战应用Singleton模式是一种应用广泛的设计模式,其目的是确保一个类在程序中只有一个实例,并提供一个全局访问点。
Singleton模式在软件开发中的应用非常广泛,今天我们就来分析一下其具体的应用场景以及实战应用。
一、Singleton模式的应用场景1.资源共享很多时候,在程序中需要同步访问某些资源,例如配置文件、数据库连接等,如果没有Singleton模式,每个线程或者每个对象都会创建自己的实例,这样会导致资源的浪费和不必要的性能开销。
而Singleton模式可以保证在整个程序中只有一个实例,所有线程或对象共享这个实例,从而避免了资源的浪费和性能开销。
2.线程池线程池是一种复用线程的技术,有时需要在回收到线程池中的线程之前,对线程中的变量或状态进行一些清理或初始化工作。
Singleton模式可以将这些线程清理或初始化的操作统一到一个全局访问点,以确保每个线程在回收到线程池中之前都能完成必要的清理或初始化工作。
3.日志系统日志系统是每个软件开发项目中必不可少的一部分,可以通过Singleton模式来保证日志系统在整个程序中只有一个实例,从而方便对日志输出方式的控制和管理。
二、Singleton模式的实战应用1.数据库连接池数据库连接池是应用Singleton模式的一个经典场景,其目的是确保在程序中只有一个数据库连接实例,所有访问数据库的线程都使用这个实例。
这不仅可以避免资源的浪费和性能开销,还可以有效地控制数据库连接的数量,从而提高系统的稳定性和效率。
2.日志系统日志系统是应用Singleton模式的另一个重要场景,其目的是确保在程序中只有一个日志实例,所有输出日志的对象都使用这个实例。
这样可以方便对日志输出方式的控制和管理,例如控制日志的级别、格式等。
3.配置文件管理器配置文件管理器是应用Singleton模式的另一个经典场景,其目的是确保在程序中只有一个配置文件管理器实例,所有访问配置文件的线程或对象都使用这个实例。
collections.singleton用法

collections.singleton用法1.简介在P yt ho n编程中,`c ol le ct io ns`模块提供了许多有用的数据结构和工具函数,其中之一就是`si ng le to n`。
`s in gl et on`是一种设计模式,它保证一个类只有一个实例,并提供全局访问点。
在本文档中,我们将探讨`co ll ec ti on s.s in gl et on`的用法和一些示例。
2.什么是s ingleto n模式?在软件开发中,s ing l et on模式是一种常用的设计模式。
它确保一个类只能创建一个对象,并提供全局访问点来访问该对象。
使用s i ng le to n模式可以避免创建多个实例,提高资源利用率,并且方便统一管理。
3. co llections.singl eton概述`c ol le ct io ns.s ing l et on`是Py th on`c o ll ec ti on s`模块中的一个函数,用于创建一个只包含一个元素的不可变集合。
它的作用是确保集合中的元素只有一个实例。
`s in gl et on`对象是不可变的,意味着它的值不能被修改。
4.c o llections.singl eton用法示例下面是一个使用`col l ec ti on s.si ng let o n`的简单示例:f r om co ll ec ti on sim p or ts in gl et on创建一个只包含一个元素的集合m y_s in gl et on=s ing l et on(42)输出:{42}尝试修改singleton对象的值会引发异常抛出TypeError: 'singleton' object does not support item assignment在上面的示例中,我们通过调用`si ng le t o n`函数创建了一个只包含一个元素的集合。
单例的构造函数和析构函数

单例的构造函数和析构函数单例模式是一种常用的设计模式,其目的是保证一个类只有一个实例,并提供一个全局访问点。
在实际开发中,我们经常需要使用单例模式来管理全局资源,例如日志、数据库连接等。
在本文中,我们将介绍单例模式的构造函数和析构函数的实现方法。
首先,我们需要了解什么是单例模式以及它的特点。
一、什么是单例模式单例模式(Singleton Pattern)是一种常用的软件设计模式。
它保证一个类只有一个实例,并提供一个全局访问点。
二、单例模式的特点1. 单例类只有一个实例对象;2. 该实例对象由单例类自行创建;3. 单例类必须向外界提供访问该实例对象的方法;4. 单例类可以有多个方法,这些方法操作该实例对象。
三、构造函数和析构函数1. 构造函数构造函数是一种特殊的成员函数,在创建对象时被调用。
它负责初始化对象的成员变量,并为对象分配内存空间。
在单例模式中,由于只有一个实例对象,因此需要对构造函数进行特殊处理。
下面是一个简单的示例代码:```class Singleton {private:static Singleton* instance;Singleton() {}public:static Singleton* getInstance() {if (instance == nullptr) {instance = new Singleton();}return instance;}};```在上面的代码中,我们定义了一个静态成员变量`instance`,并将构造函数设为私有。
这样就保证了只有单例类自己可以创建实例对象。
同时,我们定义了一个静态方法`getInstance()`,用于获取单例对象。
在该方法中,我们首先判断实例对象是否已经创建,如果没有,则创建一个新的实例对象并返回。
2. 析构函数析构函数是一种特殊的成员函数,在对象被销毁时被调用。
它负责释放对象占用的内存空间,并清理对象所持有的资源。
什么是Singleton?

什么是Singleton?Singleton:在Java中即指单例设计模式,它是软件开发中最常⽤的设计模式之⼀。
单:指唯⼀例:指实例单例设计模式,即某个类在整个系统中只能有⼀个实例对象可被获取和使⽤的代码模式。
要点:⼀、单例类只能有⼀个实例保证构造器私有化(防⽌通过构造器实例化)⼆、单例类必须⾃信创建这个实例在单例类中创建⼀个静态变量来保存这个唯⼀的实例三、单例类必须⾃⾏向整个系统提供这个实例对外提供该实例对象的获取⽅式1. 直接暴露该实例对象2. ⽤静态变量的get⽅法获取该实例对象单例的⼏种常见形式饿汉式:直接创建对象,不存在线程安全问题直接实例化饿汉式(简介直观)1/**2 * 单例饿汉式⼀(1)3 * 直接实例化饿汉式(简洁直观)4 * 对外提供获取该实例对象的⽅式:5 * (1)直接暴露6 * (2)⽤静态变量的get⽅法获取7*/8public class SingletonHungry1 {910public static final SingletonHungry1 INSTANCE = new SingletonHungry1();1112private SingletonHungry1() {}13 }141516/**17 * 单例饿汉式⼀(2)18 * 直接实例化饿汉式(简洁直观)19 * 对外提供获取该实例对象的⽅式:20 * (1)直接暴露21 * (2)⽤静态变量的get⽅法获取22*/23public class SingletonHungry2 {2425private static final SingletonHungry2 INSTANCE = new SingletonHungry2();2627private SingletonHungry2() {}2829public static SingletonHungry2 getInstance() {30return INSTANCE;31 }32 }枚举式(最简洁)1/**2 * 单例饿汉式⼆3 * 枚举式(最简洁)4*/5public enum SingletonHungry3 {6 INSTANCE7 }静态代码块饿汉式(适合复杂实例化)2 * 单例饿汉式三3 * 静态代码块饿汉式(适合复杂实例化)4*/5public class SingletonHungry4 {67public static final SingletonHungry4 INSTANCE;89private String info;1011static {12// 这⾥⽤来实现复杂的实例化13// ......复杂代码14try {15 Properties pro = new Properties();16 pro.load(SingletonHungry4.class.getClassLoader().getResourceAsStream("singleton.properties"));17 INSTANCE = new SingletonHungry4(pro.getProperty("info"));18 } catch (IOException e) {19throw new RuntimeException(e);20 }21 }2223private SingletonHungry4(String info) { = info;25 }26 }懒汉式:延迟创建对象线程不安全(适⽤于单线程)1/**2 * 单例懒汉式⼀3 * 线程不安全(适⽤于单线程)4*/5public class SingletonLazy1 {67private static SingletonLazy1 INSTANCE;89private SingletonLazy1() {}1011public static SingletonLazy1 getInstance() {12if (INSTANCE == null) {13try {14 Thread.sleep(100);15 } catch (InterruptedException e) {16 e.printStackTrace();17 }18 INSTANCE = new SingletonLazy1();19 }20return INSTANCE;21 }22 }线程安全(适⽤于多线程)1/**2 * 单例懒汉式⼆(1)3 * 线程安全(适⽤于多线程)4*/5public class SingletonLazy2 {67private static SingletonLazy2 INSTANCE;89private SingletonLazy2() {}1011public static SingletonLazy2 getInstance() {12synchronized (SingletonLazy2.class) {13if (INSTANCE == null) {14try {15 Thread.sleep(100);16 } catch (InterruptedException e) {17 e.printStackTrace();18 }19 INSTANCE = new SingletonLazy2();20 }21 }22return INSTANCE;23 }24 }2527 * 单例懒汉式⼆(2)28 * 线程安全(适⽤于多线程,优化效率)29*/30public class SingletonLazy3 {3132private static SingletonLazy3 INSTANCE;3334private SingletonLazy3() {}3536public static SingletonLazy3 getInstance() {37if (INSTANCE == null) { // 不等于空直接返回,提⾼效率38synchronized (SingletonLazy3.class) {39if (INSTANCE == null) {40try {41 Thread.sleep(100);42 } catch (InterruptedException e) {43 e.printStackTrace();44 }45 INSTANCE = new SingletonLazy3();46 }47 }48 }4950return INSTANCE;51 }52 }静态内部类形式(适⽤于多线程) 在内部类被加载和初始化时,才创建INSTANCE实例对象 静态内部类不会⾃动随着外部类的加载和初始化⽽初始化,它是要单独去加载和初始化的 因为是在内部类加载和初始化时创建的,因此是线程安全的1/**2 * 单例懒汉式三3 * 静态内部类(适⽤于多线程)4 * 在内部类被加载和初始化时,才创建INSTANCE实例对象5 * 静态内部类不会⾃动随着外部类的加载和初始化⽽初始化,它是要单独去加载和初始化的6 * 因为是在内部类加载和初始化时,创建的,因此是线程安全的7*/8public class SingletonLazy4 {910private SingletonLazy4() {}1112private static class Inner {13private static final SingletonLazy4 INSTANCE = new SingletonLazy4();14 }1516public static SingletonLazy4 getInstance() {17return Inner.INSTANCE;18 }19 }本⽂⽤于记录Singleton的学习,⽅便以后回顾!学完的东西容易忘,以⽂章的形式记录下来。
php常用设计模式及应用场景

php常用设计模式及应用场景以下是常用的 PHP 设计模式及其应用场景:1. 单例模式(Singleton Pattern):在整个应用程序中,确保一个类只有一个实例化的对象。
适用于资源共享的场景,如数据库连接、日志记录器等。
2. 工厂模式(Factory Pattern):通过工厂类统一创建对象,而不需要直接调用类的构造函数。
适用于需要根据不同参数创建不同对象的场景。
3. 抽象工厂模式(Abstract Factory Pattern):提供一个接口来创建一系列相关或相互依赖的对象,而不需要指定具体创建哪个类。
适用于需要创建一系列相互依赖的对象的场景。
4. 建造者模式(Builder Pattern):将一个复杂对象的构造与其表示分离,使得同样的构造过程可以创建不同的表示。
适用于需要构建复杂对象,并且对构建的过程有一定的灵活性时。
5. 原型模式(Prototype Pattern):通过复制现有对象来创建新对象,而不是通过调用构造函数。
适用于创建成本较大的对象,或者需要大量相同对象,并且对象间相互独立时。
6. 适配器模式(Adapter Pattern):将一个类的接口转换成另一个接口,以满足客户端的需求。
适用于需要将不兼容的接口进行适配的场景。
7. 桥接模式(Bridge Pattern):将抽象部分与实现部分分离,使得它们可以独立地变化。
适用于实现和抽象有多个维度变化的场景。
8. 组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整体”的层次结构,使得客户端可以统一地处理单个对象和组合对象。
适用于需要表示对象的“部分-整体”层次关系,并且希望客户端可以一致地处理单个对象和组合对象。
9. 装饰器模式(Decorator Pattern):动态地给一个对象添加一些额外的功能,而不需要修改其源代码。
适用于需要动态地给对象添加一些额外行为,或者不希望直接修改源代码的情况。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Singleton模式
单态定义
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
在很多操作中,比如建立目录数据库连接都需要这样的单线程操作。
还有, singleton能够被状态化; 这样,多个单态类在一起就可以作为一个状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能synchronize的安全自动加1,如果你要把这个数字永久保存到数据库,你可以在不修改单态接口的情况下方便的做到。
另外方面,Singleton也能够被无状态化。
提供工具性质的功能,
Singleton模式就为我们提供了这样实现的可能。
使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。
我们常常看到工厂模式中类装入器(class loader)中也用Singleton模式实现的,因为被装入的类实际也属于资源。
如何使用
一般Singleton模式通常有几种形式:
第二种形式:
使用Singleton.getInstance()可以访问单态类。
上面第二中形式是lazy initialization,也就是说第一次调用时初始Singleton,以后就不用再生成了。
注意到lazy initialization形式中的synchronized,这个synchronized 很重要,如果没有synchronized,那么使用getInstance()是有可能得到多个Singleton实例。
关于lazy initialization的Singleton有很多涉及
double-checked locking (DCL)的讨论,有兴趣者进一步研究。
一般认为第一种形式要更加安全些。
使用Singleton注意事项
有时在某些情况下,使用Singleton并不能达到Singleton的目的,如有多个Singleton对象同时被不同的类装入器装载;在EJB这样的分布式系统中使用也要注意这种情况,因为EJB是跨服务器,跨JVM的。
我们以SUN公司的宠物店源码(Pet Store 1.3.1)的ServiceLocator为例稍微分析一下:
在Pet Store中ServiceLocator有两种,一个是EJB目录下;一个是WEB 目录下,我们检查这两个ServiceLocator会发现内容差不多,都是提供EJB的查询定位服务,可是为什么要分开呢?仔细研究对这两种ServiceLocator才发现区别:在WEB中的ServiceLocator的采取Singleton模式,ServiceLocator 属于资源定位,理所当然应该使用Singleton模式。
但是在EJB中,Singleton 模式已经失去作用,所以ServiceLocator才分成两种,一种面向WEB服务的,一种是面向EJB服务的。
Singleton模式看起来简单,使用方法也很方便,但是真正用好,是非常不容易,需要对Java的类线程内存等概念有相当的了解。
总之
如果你的应用基于容器,那么Singleton模式少用或者不用,可以使用相关替代技术。