- 浏览: 6385 次
文章分类
最新评论
单列模式是设计模式中最简单的一个,他的设计原则是保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
单列模式使用的注意事项
只有一个私有的构造函数,包含该类自身的静态私有对象,提供一个静态的公有的函数用于创建或获取它本身的静态私有对象。
单列模式的误区
对如此简单的一个模式,我曾经陷入了一个误区,就是无论在什么时候,只要涉及到使用某个不需要重复实例化的类的时候我都使用单列模式,然而这里有个更好的实现方法,那就是工具类(静态方法)即可完美解决这个问题。
单列模式的使用场景
那么单列模式到底该用在何处呢?虽然我个人还没有遇到适合使用该方法的地方,但是在网上粗略查了一下,一般是用于系统的统计以及需要共用一些数据的时候。这样一个类中只有一个实例才会显的有意义。
比如:任务管理器,回收站,网站计数器,日志应用,数据库连接池,多线程连接池,HttpApplication等。
单列模式经典例子
单列模式实例创建有两种,懒汉式与饿汉式。
饿汉模式,即刚开始启动时就把所有实例创建好,这样会降低启动速度,并且系统会占用大量资源。
懒汉式即懒启动模式,只有该实例被需要的时候创建,这样可以减少启动时所需资源,加快启动速度。一般情况下我们都想延时加载对象,希望在第一次获取的时候才构造对象。
懒汉式如果在多线程的情况下,还需要使用线程锁以确保只有一个实例被创建。
这里不给方法加线程锁是因为每个线程调用getInstance都要加锁,我们想要只在第一次调用getInstance时加锁。
多线程中还会遇到一个指令重排序问题(见注释1)如果instance实例变量用volatile修饰就可以解决该问题,volatile修饰的话就可以确保instance = new Singleton();对应的指令不会重排序
注释1
在线程A中有两条语句对这两个共享变量进行赋值操作:
a = 1;
b = 2;
假设当线程A对a进行复制操作的时候发现这个变量在主内存已经被其它的线程加了访问锁,那么此时线程A怎么办?等待释放锁?不,等待太浪费时间了,它会去尝试进行b的赋值操作,b这时候没被人占用,因此就会先为b赋值,再去为a赋值,那么执行的顺序就变成了:
b = 2;
a = 1;
单列模式使用的注意事项
只有一个私有的构造函数,包含该类自身的静态私有对象,提供一个静态的公有的函数用于创建或获取它本身的静态私有对象。
单列模式的误区
对如此简单的一个模式,我曾经陷入了一个误区,就是无论在什么时候,只要涉及到使用某个不需要重复实例化的类的时候我都使用单列模式,然而这里有个更好的实现方法,那就是工具类(静态方法)即可完美解决这个问题。
单列模式的使用场景
那么单列模式到底该用在何处呢?虽然我个人还没有遇到适合使用该方法的地方,但是在网上粗略查了一下,一般是用于系统的统计以及需要共用一些数据的时候。这样一个类中只有一个实例才会显的有意义。
比如:任务管理器,回收站,网站计数器,日志应用,数据库连接池,多线程连接池,HttpApplication等。
单列模式经典例子
单列模式实例创建有两种,懒汉式与饿汉式。
饿汉模式,即刚开始启动时就把所有实例创建好,这样会降低启动速度,并且系统会占用大量资源。
public class HungrySingleton { private static HungrySingleton instance = new HungrySingleton(); private HungrySingleton() { } public static HungrySingleton getInstance() { return instance; } }
懒汉式即懒启动模式,只有该实例被需要的时候创建,这样可以减少启动时所需资源,加快启动速度。一般情况下我们都想延时加载对象,希望在第一次获取的时候才构造对象。
public class LazySingleton { private static LazySingleton instance = null; private LazySingleton() { } public static LazySingleton getInstance() { if (instance == null) { instance = new LazySingleton(); } return instance; } }
懒汉式如果在多线程的情况下,还需要使用线程锁以确保只有一个实例被创建。
public static class Singleton{ private static Singleton instance=null; private Singleton(){ //do something } public static Singleton getInstance(){ if(instance==null){ synchronized(Singleton.class){ if(null==instance){ instance=new Singleton(); } } } return instance; } }
这里不给方法加线程锁是因为每个线程调用getInstance都要加锁,我们想要只在第一次调用getInstance时加锁。
多线程中还会遇到一个指令重排序问题(见注释1)如果instance实例变量用volatile修饰就可以解决该问题,volatile修饰的话就可以确保instance = new Singleton();对应的指令不会重排序
public class Singleton { private static volatile Singleton instance = null; private Singleton() { } public static Singleton getInstance() { if(instance == null) { synchronzied(Singleton.class) { if(instance == null) { instance = new Singleton(); } } } return instance; } }
注释1
在线程A中有两条语句对这两个共享变量进行赋值操作:
a = 1;
b = 2;
假设当线程A对a进行复制操作的时候发现这个变量在主内存已经被其它的线程加了访问锁,那么此时线程A怎么办?等待释放锁?不,等待太浪费时间了,它会去尝试进行b的赋值操作,b这时候没被人占用,因此就会先为b赋值,再去为a赋值,那么执行的顺序就变成了:
b = 2;
a = 1;
发表评论
-
系统重构总结
2016-06-19 03:01 01.Duplicated Code(重复的 ... -
设计模式总结之工厂模式 (Factory)
2016-04-23 19:04 660工厂方法模式,定义了一个创建对象的接口,由子类决定要实例化 ... -
设计模式总结之适配器模式(adapter)
2016-04-21 15:18 543适配器模式定义:将一个类的接口,转化成客户期望的另一个接口 ... -
设计模式总结之模版方法模式 (Template)
2016-04-11 16:56 432模式定义 在一个方法中定义一个算法的骨架, ... -
设计模式总结之装饰模式 (Decorator)
2016-04-22 13:17 534装饰模式(Decorator)就是使用被装饰的一个子类的实 ... -
设计模式总结之代理模式 (Proxy)
2016-04-18 00:12 489代理模式(Proxy)就是为其他对象提供一种代理以控制这个 ... -
设计模式总结之职责链模式 (Chain of responsibility)
2016-04-19 11:42 811责任链模式是一种对象的行为模式。在责任链模式里,很多对象由 ... -
设计模式总结之命令模式 (Command)
2015-08-20 10:32 0将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数 ... -
设计模式总结之迭代器模式 (Iterator)
2015-08-20 10:28 0提供一种一致的方法来顺序遍历一个容器中的所有元素。 -
设计模式总结之策略模式 (Strategy)
2016-04-25 22:15 533策略模式定义了算法族,分别封装起来,让它们之间可以互相替换 ... -
设计模式总结之状态模式(State)
2016-04-23 22:15 587状态模式(State)就是根据对象的状态不同,将有不同的行 ... -
设计模式总结之观察者模式(Observer)
2016-04-20 16:02 525观察者模式(Observer)就是定义对象间 ... -
设计原则总结
2016-04-21 12:50 435开放关闭原则 对扩展开放,对修改关闭。 即在添加功能的 ... -
设计模式分析与总结
2014-06-17 16:19 0设计模式的分类总体来说设计模式分为三大类(共23种):创建 ...
相关推荐
单例模式是软件设计模式中的一种基础模式,它在Java编程中被广泛应用。单例模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式可以有效地控制资源的使用,限制实例的数量,提高性能,尤其是在...
单例模式是软件设计模式中的一种经典模式,它在Java编程中被广泛使用。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于可以控制实例的数量,减少资源消耗,同时便于协调整个...
在软件开发中,设计模式是一种在特定情境下解决常见问题的经验总结,被广泛应用于各种编程语言中。在Qt框架中,单例设计模式是一种经常被用到的设计模式,它确保一个类只有一个实例,并提供全局访问点。这个模式在...
单例模式是软件设计模式中的一种经典模式,它在C#编程中被广泛使用,尤其在需要确保一个类只有一个实例并且提供全局访问点时。单例模式的主要目标是控制类的实例化过程,保证在整个应用程序运行期间,该类只创建一个...
单列模式(Singleton Pattern)是设计模式中的一种经典模式,主要用来确保一个类只有一个实例,并提供一个全局访问点。这种模式常被用于控制资源的共享,例如配置管理、线程池或者数据库连接池等场景。在Java编程...
如:IO处理,数据库操作等,由于这些对象都要占用重要的系统资源,所以我们必须限制这些实例的创建或始终使用一个公用的实例,这就是我们今天要介绍的——单例模式(Singleton)。 使用频率高 单件模式(Singleton...
单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制数据库连接、缓存管理、线程池等。下面我们将深入探讨单例模式的几种实现...
单例模式是 Java 设计模式中的一种常见模式,旨在保证整个应用中只有一个类的实例存在。单例模式分为三种:懒汉式单例、饿汉式单例、登记式单例。下面对单例模式的特点、实现方式和应用场景进行详细介绍。 单例模式...
单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类只有一个实例,并提供全局访问点。在C++中,实现单例模式有多种方式,这里我们将聚焦于懒汉式(Lazy Initialization)的实现。懒汉式单例的特点...
总结来说,单例模式是设计模式的一种,它的核心是限制类的实例化次数为一次,以达到控制共享资源的目的。Java中有多种实现方式,包括饿汉式、懒汉式和登记式,它们在实现细节和性能上有差异,适用于不同的应用场景。...
综上所述,单例模式通过限制类的实例化次数为一次,提供了对单一实例的全局访问,是软件开发中常见的设计模式之一。不同的实现方式各有优缺点,开发者应根据具体的应用场景和需求选择最合适的实现策略。
2. **单例模式(Singleton Pattern)**:这是一种创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。在多线程环境中,单例模式确保对共享资源的唯一访问,避免并发问题。在Qt中,我们通常使用单例...
工厂模式是一种创建型设计模式,用于创建对象而不必暴露创建逻辑到客户端,并且通过使用一个共同的接口来指向新创建的对象。它提供了一种将对象创建逻辑封装起来的方法,使用者在创建对象时不需要关心具体的实现细节...
单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。在Java或类似的面向对象编程语言中,单例模式常用于管理共享资源,如数据库连接池、线程池或者配置文件等。在这个...
总结来说,单例模式和简单工厂模式都是面向对象编程中的设计模式。单例模式确保一个类只有一个实例,并提供一个全局访问点;而简单工厂模式则封装了创建对象的过程,使客户端不必关心对象的创建过程。这两种模式在...
.NET Core中的依赖注入(Dependency Injection,DI)是框架的核心特性之一,它有助于构建松散耦合、可测试和可维护的代码。...在设计服务时,应根据其状态、生命周期和并发需求来选择合适的注入模式。
QT静态单例管理信号和槽是Qt框架中一种常见的设计模式,用于确保应用程序中只有一个特定类的实例。在Qt编程中,单例模式通常用于管理全局资源,如数据库连接、配置文件读取或系统设置。这里我们将深入探讨如何在Qt中...
单例模式和工厂模式是两种常见的设计模式,它们在实际开发中有着广泛的应用。 **单例模式**的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这在某些场景下非常有用,比如管理共享资源、数据库连接或者...
单例模式是所有设计模式中最简单的一种,主要用于确保整个应用程序中只有一个实例存在。c# 中实现单例模式有多种方法,本文将详细介绍饿汉式和懒汉式两种实现方法。 饿汉式 饿汉式是最简单的单例模式实现方法,在...