`
xitongyunwei
  • 浏览: 926010 次
文章分类
社区版块
存档分类
最新评论

GoF设计模式学习-单例模式

 
阅读更多

1.目的

控制实例的个数,类设计者应该保证只有一个实例,不能将此责任【只有一个实例】强制交给类使用者。

2.整体实现

1.单线程单例模式的实现。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LearnDesignPattern
{
    public class Singleton
    {
        private Singleton() { }//构造函数私有化,使得用户无法通过new关键字创建对象
        private static Singleton instance;
        public static Singleton Instance
        {
            get
            {//懒加载模式,用户也可以每次获取的时候,都new,但是这样不推荐
                //首先判断,如果为第一次使用,则进行new
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
        //注意【1】,C#的单例模式一般使用属性来获取Instance
        //而在Java,中一般使用public static Singleton getInstance()的方法,这点不同
        //注意【2】,为什么要使用Static关键字呢,我们知道Static的关键字的作用是
        //可以直接通过类名来进行调用,这样就保证了,需要先有类的实例才能获取
        //非static属性的情况
    }
}

2.多线程单例模式实现:

//如果两个线程同时判断instance是不是为空,当instance==null的时候
    //两个线程就同时创建出来实例,这样就存在了两个实例了
    public class Singleton
    {
       private Singleton() { }
        //volatile:被volatile修饰的变量的值,将不会被本地线程换缓存
        //所有对该变量的读写都是直接操作共享内存,从而确保多个线程能
        //正确的处理该变量
        private static volatile Singleton instance;
        //添加线程锁,确保只有一个线程可以访问该范围的代码,其他线程等待
        private static object objectLock = new object();
        public static Singleton Instance
        {
            //double check双重检查机制
            get
            {
                if (instance == null)
                {
                    lock (objectLock)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }
    }

3.经典的多线程单例模式写法。

 //【使用静态构造器】
        //1.静态构造函数既没有访问修饰符,也没有参数
        //2.在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类
        //3.无法直接调用静态构造函数
        //4.在程序中,用户无法控制何时执行静态构造函数
        //【保证1】保证使用类实例或者静态成员之前初始化
        //【保证2】懒加载,只有在第一次使用,才调用静态构造器
        //【保证3】.net框架会自动为多线程加锁
        public static readonly Singleton Instance = new Singleton();
        private Singleton() { }
        //【弊端】不支持参数化Singleton,因为传参必须使用方法来进行!!!GetInstance(object a,object b){}


4.参数化Singleton

//参数化Singleton
        private Singleton(int a,int b)
        {
            this.A = a;//A、B均为静态属性
            this.B = b;//A、B均为静态属性
        }
        public static Singleton GetInstance(int x, int y)
        {
            if (instance == null)
            {
                instance= new Singleton(x, y);
            }
            //可修改单例模式!就相当于修改当前单例的属性,并不会重新创建新的实例
            else
            {
                instance.A = x;//A、B均为静态属性
                instance.B = y;//A、B均为静态属性
            }
            return instance;
        }

3.思考

1.实例的个数可以两个么?三个......多个。使用时,一次创建多个,放在池子中,使用的时候去取。

2.如何将new构造器放到其他类中,实现局部使用一个对象的实例。

3.将new进行屏蔽,然后通过其他方法来实现new的效果【不仅仅是单例】。


分享到:
评论

相关推荐

    Gof-23种设计模式

    Gof-23种设计模式,观察者,适配器,单例,工厂模式

    Java模式设计之单例模式

    作为对象的创建模式[GOF95], 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

    GoF 的 23 种设计模式

    GoF 的 23 种设计模式的分类,现在对各个模式的功能进行介绍。 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。 原型(Prototype)模式:将一...

    设计模式(Java源码示例,超经典).rar

    1.包括GOF提出的23种设计模式; 2.采用Java做为源代码示例; 3.源代码的package分类非常清楚,模式类型->模式名称->模式种类->示例->角色名称,让您一下就看清楚共几种设计模式,具体的一种设计模式又有几种细分,每...

    设计模式部分习题集锦,程序员必看设计模式

    创建型设计模式:简单工厂模式,工厂方法模式,抽象工厂模式,建造者模式,原型模式,单例模式; 结构型设计模式:适配器模式,桥接模式,组合模式,装饰模式,外观模式,轻量级模式,代理模式; 行为性设计模式:...

    Android设计模式系列之单例模式

    单例模式,可以说是GOF的23种设计模式中最简单的一个。接下来通过本文给大家实例讲解android设计模式系列之单例模式的相关知识,感兴趣的朋友一起看看吧

    php实现设计模式中的单例模式详解

    2、缩小命名空间 单例模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染命名空间 3、允许对操作和表示的精华 单例类可以有子类。而且用这个扩展类的实例来配置一个应用是很容易的。你可以用你所...

    研磨设计模式-part2

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式-part4

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式-part3

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式(完整带书签).part2.pdf

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    uu-design-pattern:23种设计模式案例

    23种设计模式演示代码文件结构图gof23 |- creational(创建型模式) |- simplefactory 简单工厂模式案例 |- factorymethod 工厂方法模式案例 |- abstractfactory 抽象工厂模式案例 |- builder 建造者模式案例 |- ...

    Java面试宝典(设计模式,算法,Linux篇).docx

    答: 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最...

    设计模式所有实验及实验报告及代码.zip

    2GoF 的 23 种设计模式 3UML中的类图及类图之间的关系 4开闭原则 5里氏替换原则 6依赖倒置原则 7单一职责原则 8接口隔离原则 9迪米特法则 10合成复用原则 11创建型模式的特点和分类 12单例模式 13原型模式 14工厂...

    Java-GoF-DesignPattern:在Android Studio中学习Java Gof设计模式

    关于#GoF设计模式 ## 1.工厂方法模式 #### #### ## 2.抽象工厂模式 #### #### ## 3.构建器模式 ## 5.单例模式 ## 19.观察者模式

    gof:GoF的23种设计模式

    GoF 设计模式GoF所提出的23种设计模式主要基于以下面向对象设计原则:对接口编程而不是对实现编程优先使用对象组合而不是继承23种设计模式分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural ...

    23种设计模式gof23.rar

    这个案例主要包括以下设计模式 创建型模式:单例模式;工厂模式;创建者模式;原型模式 结构型模式:适配器模式;桥接模式;代理模式

    研磨设计模式(完整带书签).part1.pdf

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    design-patterns-ruby:Ruby 中的 GOF 设计模式

    Ruby 的设计模式 设计模式 处理对象创建机制的设计模式,尝试以适合情况的方式创建对象。 - 用于创建和使用相关/依赖对象系列 - 用于逐步创建不同类型的复杂对象 - 用于从许多对象中创建一种可以代替它使用的对象 ...

Global site tag (gtag.js) - Google Analytics