zoukankan      html  css  js  c++  java
  • 设计模式——单例模式

    单例模式是设计模式中最常用的设计模式之一。单例模式有<懒汉模式>和<饿汉模式>,他们有各自的优缺点,在设计过程中要合理选择,不然将会造成严重的后果。

    接下来我们先看<饿汉模式> ——所谓<饿汉模式>就是我们将在需要使用该类的对象时进行创建,上代码

     1  //   <懒汉模式>  
     2     class Myclass {
     3         // 第一步,私有化构造方法,禁止在外部创建对象
     4         private Myclass() {
     5 
     6         }
     7         // 第二步, 声明该对象
     8         static Myclass myclass;
     9         // 第三步,创建一个获得实例的静态方法
    10         public static Myclass  Getinstance() {     
    11             if (myclass == null ) {
    12                 myclass = new Myclass();
    13             }
    14             return myclass;
    15         }
    优点:能够在需要使用该类时创建对象,不需要用到时将不会创建,节省了系统资源
    缺点:在多线程中,如果两个线程同时需要该类的对象,将会造成创建了被创建了两个对象,这是个非常严重的问题,这便是局限之处
    使用:在单线程中我们将可以使用<懒汉模式>来构建单例模式。
    在一些单线程程序开发中,我们可以将一个管理类(manage)构建成单例模式,对于这类管理类,程序一开始运行就会被创建对象,所以这儿的单例模式就可以设计成<懒汉模式>。

    然后是<饿汉模式>——所谓<饿汉模式>就是将会直接创建对象,不管是否将会用到该对象。上代码
     1      //   <饿汉模式>  
     2     class Myclass {
     3         // 第一步,私有化构造方法,禁止在外部创建对象
     4         private Myclass() {
     5         }
     6         // 第二步, 创建该对象
     7         private  static Myclass myclass = new Myclass();
     8         // 第三步,创建一个获得实例的静态方法
     9         public static Myclass  Getinstance() {     
    10             return myclass;
    11         }
    
    
    优点:在多线程中将不会被创建多个实例。
    缺点:有时将不会用到该对象,则造成了系统资源的浪费。

    看了这两种模式,是不是感觉都比较极端,接下来看 双重检查 来构建的单例模式,推荐使用,但并非完美,会受到指令重排的影响
     1 <双重检查>
     2 class Myclass {
     3         // 第一步,私有化构造方法,禁止在外部创建对象
     4         private Myclass() {
     5         }
     6         // 第二步, 创建该对象
     7         private static Myclass myclass;
     8         // 创建一个只读object对象
     9         private static readonly object padlock = new object();
    10         // 第四步,创建一个获得实例的静态方法    进行两次判断
    11         public static Myclass  Getinstance() {
    12             if (myclass == null ) {
    13                 lock (padlock) {
    14                     if (myclass == null ) {
    15                         myclass = new Myclass();
    16                     }
    17                 }
    18             }
    19             return myclass;
    20         }
    
    

    还有一种方法   静态内部类,推荐使用

     class Myclass {
            // 第一步,私有化构造方法,禁止在外部创建对象
            private Myclass() {
            }
            // 第二步, 创建静态类
            private static   class  manage {
                public   static readonly  Myclass myclass = new Myclass();
            }
    
            // 第三步,创建一个获得实例的静态方法
            public static Myclass  Getinstance()
            {
                return  manage.myclass;
            }
               

    那我们在哪些场合可以使用单例模式呢?

    1.创建工具类对象时;

    2.需要经常销毁或创建的对象

    3.创建对象时耗时过多或耗费资源过多,但又经常用到的对象;

    4.频繁访问数据库或文件的对象。



  • 相关阅读:
    PHP学习笔记11——文件处理
    PHP学习笔记10——GD图片处理
    PHP学习笔记09——GD生成验证码实例
    PHP学习笔记08——GD绘图基础
    PHP学习笔记07——字符串和正则
    poj 3254 Corn Fields
    线程
    字符串是否包含问题
    左旋转字符串
    凸包问题
  • 原文地址:https://www.cnblogs.com/spiderljx/p/10767555.html
Copyright © 2011-2022 走看看