精华内容
下载资源
问答
  • iOS-创建单例模式

    千次阅读 2016-03-31 15:30:20
    iOS中创建单例模式 方法一:#pragma mark - 设计单例模式 static id _instance; //重写allocWithZone:方法 +(instancetype)allocWithZone:(struct _NSZone *)zone{ @synchronized (self) { if (_instance == nil) ...

    iOS中创建单例模式
    方法一:

    #pragma mark - 设计单例模式
    static id _instance;
    //重写allocWithZone:方法
    +(instancetype)allocWithZone:(struct _NSZone *)zone{
        @synchronized (self) {
            if (_instance == nil) {
                _instance = [super allocWithZone:zone];
            }
        }
        return _instance;
    }
    //提供类方法让外界访问唯一的实例
    +(instancetype)shareInstance{
        @synchronized (self) {
            if (_instance == nil) {
                _instance = [[self alloc] init];
            }
        }
        return _instance;
    }
    //实现copyWithZone方法
    -(id)copyWithZone:(struct _NSZone *)zone{
        return _instance;
    }
    

    方法二:

    +(instancetype)sharedInstance {
        static WMSingleton *singleton = nil;
        if (! singleton) {
            singleton = [[self alloc] initPrivate];
        }
        return singleton;
    }
    
    - (instancetype)init {
        @throw [NSException exceptionWithName:@"这个是个单例"
                                       reason:@"应该这样调用 [WMSingleton sharedInstance]"
                                     userInfo:nil];
        return nil;
    }
    //实现自己真正的私有初始化方法
    - (instancetype)initPrivate {
        self  = [super init];
        return self;
    }

    方法三:

    static WMObject *_instance;
    
    + (instancetype)allocWithZone:(struct _NSZone *)zone
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _instance = [super allocWithZone:zone];
        });
        return _instance;
    }
    
    + (instancetype)sharedInstance
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _instance = [[self alloc] init];
        });
        return _instance;
    }
    
    - (id)copyWithZone:(NSZone *)zone
    {
        return _instance;
    }

    方法四:

    创建一个WMSingleton.h
    // .h文件
    #define WMSingletonH(name) + (instancetype)shared##name;
    
    // .m文件
    #define WMSingletonM(name) \
    static id _instance; \
     \
    + (instancetype)allocWithZone:(struct _NSZone *)zone \
    { \
        static dispatch_once_t onceToken; \
        dispatch_once(&onceToken, ^{ \
            _instance = [super allocWithZone:zone]; \
        }); \
        return _instance; \
    } \
     \
    + (instancetype)shared##name \
    { \
        static dispatch_once_t onceToken; \
        dispatch_once(&onceToken, ^{ \
            _instance = [[self alloc] init]; \
        }); \
        return _instance; \
    } \
     \
    - (id)copyWithZone:(NSZone *)zone \
    { \
        return _instance; \
    }
    
    
    
    使用方法
    
    //.h类
    //引入这个宏文件
    #import "WMSingleton.h"
    @interface WMObject : NSObject
    WMSingletonH(object)
    @end
    //.m类
    
    @implementation WMObject
    WMSingletonM(Car)
    @end
    展开全文
  • Python创建单例模式的六种方式.pdf
  • 主要介绍了Java单例模式和多例模式,结合实例形式分析了java单例模式与多例模式的定义及使用技巧,需要的朋友可以参考下
  • 是我在php面试题中遇到的一道试题,单例模式按字面来看就是某一个类只有一个实例,这样做的好处还是很大的,比如说数据库的连接,我们只需要实例化一次,不需要每次都去new了,这样极大的降低了资源的耗费
  • 使用python写的使用但里模式创建的一个日志记录器,具体相关知识可以参阅我的博客。
  • 主要介绍了react 创建单例组件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • qt5编写的单例模式

    2018-01-28 10:28:48
    使用qt5编写的单例模式,主要描述了单例模式的构建过程,程序可在qt5下直接运行 交流
  • 今天介绍如何利用反射来创建单例模式的另一个实例,以及枚举实现单例模式规避反射的原理。 一. 反射创建单例模式的另一个实例1. 实现一个单例模式package com.zhonghq.reflection;public class SingleTon { ...

    单例模式是最常见的一个模式,在java中单例模式大量被使用。关于单例模式的实现场景可查看java单例模式。今天介绍如何利用反射来创建单例模式的另一个实例,以及枚举实现单例模式规避反射的原理。

    一. 反射创建单例模式的另一个实例

    1. 实现一个单例模式

    package com.zhonghq.reflection;
    
    public class SingleTon {
        private static SingleTon instance = null;
        private SingleTon(){}
    
        public static SingleTon getInstance(){
            if (instance == null){
                instance = new SingleTon();
            }
    
            return instance;
        }
    
        public void single(){
            System.out.println("single single");
        }   
    }

    2. 使用SingleTon

    我们通过正常方式实例化SingleTon,同时通过反射获取SingleTon的instance,对比它们的地址,如果地址不同就表明另一个实例创建成功。

    实现代码如下:

    package com.zhonghq.reflection;
    
    import java.lang.reflect.AccessibleObject;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    
    public class Main {
        public static void main(String[] args) throws Exception {
            // 正常使用单例模式    
            SingleTon singleTon = SingleTon.getInstance();
            System.out.println("正常使用singleTon:"  + singleTon);
            singleTon.single();
    
            // 使用反射获取instance
            Class class1 = Class.forName("com.zhonghq.reflection.SingleTon");
            Constructor[]  constructors = class1.getDeclaredConstructors();
            AccessibleObject.setAccessible(constructors, true);
    
            for (Constructor c : constructors){
                if (c.isAccessible()){
                    Object classObject  = c.newInstance();
                    System.out.println("反射使用singleTon:" + classObject);
                    Method method = class1.getMethod("single");
                    method.invoke(classObject);
                }
            }   
        }
    }

    运行,得到以下结果:

    正常使用singleTon:com.zhonghq.reflection.SingleTon@728edb84
    single single
    反射使用singleTon:com.zhonghq.reflection.SingleTon@edf1de
    single single

    可以看到两个地址明显不同,另一个实例创建成功。

    二. 枚举方式规避原理

    我们同样以代码来查看

    1. 实现枚举单例

    package com.zhonghq.reflection;
    
    public enum EnumSingleTon {
        instance;
    
        public void single(){
            System.out.println("enum single");
        }
    }

    2. 使用SingleTon

    修改示例一中使用SingleTon的代码

    Class class1 = Class.forName("com.zhonghq.reflection.SingleTon");

    修改为:

    Class class1 = Class.forName("com.zhonghq.reflection.EnumSingleTon");

    其他不变,运行,结果如下:

    正常使用singleTon:com.zhonghq.reflection.SingleTon@728edb84
    single single
    Exception in thread "main" java.lang.IllegalArgumentException: Cannot reflectively create enum objects
        at java.lang.reflect.Constructor.newInstance(Constructor.java:521)
        at com.zhonghq.reflection.Main.main(Main.java:19)

    可以看出反射方式执行失败了,抛出了IllegalArgumentException,另一个实例的创建失败。

    那么为什么呢?
    查看异常我们发现问题出在代码Object classObject = c.newInstance(); 该代码是使用java.lang.reflect.Constructor的newInstance()方法实现的,查看该方法的实现我们发现其禁止了通过反射构造枚举对象,代码如下;

    if ((clazz.getModifiers() & Modifier.ENUM) != 0)   
        throw new IllegalArgumentException("Cannot reflectively create enum objects");  
    展开全文
  • 主要介绍了Flask框架单例模式实现方法,结合实例形式分析了flask框架单例模式的4种实现方式与相关操作技巧,需要的朋友可以参考下
  • TS创建型设计模式之单例模式

    千次阅读 2019-01-15 00:12:47
    定义 Ensure a class has only one instance,and provide a global point of access to ...//懒汉式单例又称惰性单例,前端不考虑,如果是后端可能会考虑高并发的情况下出现多个实例 class LazySingle { private ...

    定义

    Ensure a class has only one instance,and provide a global point of access to it.
    (确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例)

    应用(例子)

    //懒汉式单例又称惰性单例,前端不考虑,如果是后端可能会考虑高并发的情况下出现多个实例
    class LazySingle {
    	private static _instance = null;
    	//限制产生多个对象
    	private constructor(){
    
    	}
    	//获得实例对象
    	public static getInstance():LazySingle{
    		if(!this._instance){
    			this._instance = new LazySingle();
    		}
    		return this._instance;
    	}
    }
    //饿汉式单例
    class HungrySingle{
    	private static _instance:HungrySingle = new HungrySingle();
    	//限制产生多个对象
    	private constructor(){
    
    	}
    	//获得实例对象
    	public static getInstance():HungrySingle{
    		return this._instance;
    	}
    }
    

    好处

    1. 减少内存开支
    2. 减少性能开支,如配置需要频繁读取的信息
    3. 避免对资源的多重占用,造成不必要的麻烦
    4. 优化和共享资源访问,比如组件状态管理,我会创建一个单例来存状态信息(比如说左侧list选中那个),让子组件间通信变简单。

    应用场景

    一个类出现多个对象会有“不良反应”的时候:

    1. 需要生成唯一序列号的环境
    2. 在整个项目中需要一个共享访问点或共享数据,之前我写后端代码的时候,做一个大转盘,没使用单例模式,当只剩下几个奖品时,有很多人在抽奖抽出来的奖品远大于库存,是很尴尬,这里的库存就是一个共享数据。
    3. 创建一个资源需要消耗的资源过多,比如用户信息,不可能每次都去取吧
    4. 需要定义大量静态变量和静态方法(如工具类),JS中单例模式经常作为命名空间来使用
    展开全文
  • 主要介绍了javascript单例模式的简单实现方法,以javascript创建唯一实例的形式分析了javascript单例模式的简单实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • /** * 私有的构造方法 */ private ${NAME}(){} /** * 单例的实例 * * @return this */ public static ${NAME} getInstance(){ if(instance == null){ synchronized(${NAME}.class){ if(instance == null){ instance...

    Settings - Editor - File and Code Templates - Files - Class

    例子给的是懒汉式的,其他的自行更改

    #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
    #parse("File Header.java")
    public class ${NAME} {
    
        /**
         * 本实例
         */
        private static ${NAME} instance;
        
        /**
         * 私有的构造方法
         */
        private ${NAME}(){}
        
        /**
         * 单例的实例
         *
         * @return this
         */
        public static ${NAME} getInstance(){
            if(instance == null){
                synchronized(${NAME}.class){
                    if(instance == null){
                        instance = new ${NAME}();
                    }
                }
            }
            return instance;
        }
    
    }
    

     

    展开全文
  • 博文地址:http://www.cnblogs.com/imstrive/p/5426503.html
  • 饿汉模式、懒汉模式、DCL单例模式、枚举;不同情况下使用不同的单例创建模式
  • 本文主要讲了单例模式的特点,优缺点和4种单例模式创建,但是这4中单例模式真的是完美的单例模式吗?有没有什么方式可以破坏单例?有没有什么方式可以防止单例被破坏?敬请期待单例模式下一期 欢迎加入我们的知识星球,...
  • 01. 单例设计模式 设计模式 设计模式是前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对某一特定问题的成熟的解决方案 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性...
  • 单例模式能在合适的时候创建对象,并且创建唯一的一个。 代码接近于生活,很有意思。比如一个网站的登录,点击登录后弹出一个登录弹框,即使再次点击,也不会再出现一个相同的弹框。又或者一个音乐播放程序,如果...
  •  作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。 2、单例模式的三个要点: (1). 需要...
  • 单例指的是只能存在一个实例的类(在C#中,更准确的说法是在每个AppDomain之中只能存在一个实例的类,它是软件工程中使用最多的几种模式之一。在第一个使用者创建了这个类的实例之后,其后需要使用这个类的就只能...
  • 单例模式创建线程池和使用

    万次阅读 2017-01-15 15:14:13
    因为在一个程序中往往都只会使用一个线程池,所以为了代码更加的完善,我们可以使用单例模式创建线程池,单例模式是一种设计模式,特点是它私有化了构造方法,内部创建了一个需要返回的对象,比如我们创建线程池...
  • 面试官:有用过单例模式吗? 我:有有有(自信满满)。 面试官:说说单例模式几种写法? 我:懒汉式和饿汉式,懒汉式巴拉巴拉,饿汉式巴拉巴拉。 面试官:我们都知道synchronized加锁是比较耗费资源的,你这种写法...
  • 连接数据库单例模式

    2016-07-28 12:34:42
    连接数据库单例模式
  • 这段时间从头温习设计模式。记载下来,以便自己复习,也分享给大家。 package com.iter.devbox.singleton; /** * 饿汉式 * @author Shearer * */ public class SingletonDemo1 { // 类的静态成员变量只...
  • 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器...
  • 单例模式,属于创建型模式,《设计模式》一书对它做了定义:保证一个类仅有一个实例,并提供一个全局访问点。 单例模式适用于无状态的工具类、全局信息类等场景。例如日志工具类,在系统中记录日志;假设我们需要...
  • java 设计模式–单例模式推理过程 设计模式(全名:软件设计模式),是一套反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可靠性...
  • 单例模式的代码实现

    2019-09-17 11:37:13
    单例模式适用在一个项目中只需要使用一个唯一的对象的情况下,这样可以保证项目中任何一个地方的修改在其他地方都可以接收到,从而保证数据的唯一性和共享性。 饿汉式代码 public class Hungry { private static ...
  • 什么是单例模式 单例就是单个对象的意思,指在系统运行期间,一个类最多只能创建一个对象,且该类能自行创建这个对象的一种编码设计模式。 单例模式有两个特点: 在系统的整个生命周期...所以该类就必须自己创建单例
  • 单例模式典型的应用场景:单击按钮时,页面中会出现一个登陆浮窗,而该登录浮窗是唯一的,无论单击多少次按钮,这个浮窗都会被创建一次,则适合用单例模式创建。 全局变量不是单例模式,但在JavaScript开发中,经常...
  • 作为对象的创建模式,单例模式确保某一个类只有一个实例,并且对外提供这个全局实例的访问入口。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。 二、PHP单例模式三要素 1. 需要一个保存类的唯一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 226,065
精华内容 90,426
关键字:

如何创建单例模式