• 设计模式——单例设计模式


    单例设计模式

    一、解决的问题

    保证一个类在内存中的对象唯一性。

    比如对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。

    二、如何保证对象唯一性?

    1,不允许其他程序用new创建该类对象。
    2,在该类创建一个本类实例。
    3,对外提供一个方法让其他程序可以获取该对象。

    三、步骤:
    1,私有化该类构造函数。(为保证不让其他成员创建该类对象。可将构造函数私有化。)

    2,通过new在本类中创建一个【私有并静态】的本类对象。
    3,定义一个公有的方法,将创建的对象返回。

    例:

     1 //饿汉式(开发用的比较多)
     2 class Single//类一加载,对象就已经存在了。
     3 {
     4     private static Single s = new Single();
     5 
     6     private Single(){}
     7 
     8     public static Single getInstance()//获取实例 *可控*:私有的成员变量s。
     9     {
    10         return s;
    11     }
    12 }
    13 
    14 
    15 //懒汉式(面试考的多)*多线程会出问题*
    16 class Single2//类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象。
    17              //延迟加载形式。 
    18 {
    19     private static Single2 s = null;
    20 
    21     private Single2(){}
    22 
    23     public static Single2 getInstance()
    24     {
    25         if(s==null)
    26             s = new Single2();
    27         return s;
    28     }
    29 }
    30 
    31 
    32 class  SingleDemo
    33 {
    34     public static void main(String[] args) 
    35     {
    36         Single s1 = Single.getInstance();
    37         Single s2 = Single.getInstance();
    38 
    39         System.out.println(s1==s2);
    40         
    41 //        Single ss = Single.s;  
    42 
    43 //        Test t1 = new Test();
    44 //        Test t2 = new Test();      //不能new
    45         Test t1 = Test.getInstance();//通过这种方式获取实例
    46         Test t2 = Test.getInstance();
    47         t1.setNum(10);
    48         t2.setNum(20);
    49         System.out.println(t1.getNum());
    50         System.out.println(t2.getNum());
    51     }
    52 }
    53 
    54 
    55 class Test
    56 {
    57     private int num;
    58 
    59     private static Test t = new Test();
    60     private Test(){}
    61     public static Test getInstance()
    62     {
    63         return t;
    64     }
    65     public void setNum(int num)
    66     {
    67         this.num = num;
    68     }
    69     public int getNum()
    70     {
    71         return num;
    72     }
    73 
    74 }

     结果:

    true
    20
    20
    

    说明拿到的实例是同一个。

  • 相关阅读:
    再谈后兵 FileInfo 与 DirectoryInfo类 清晰的winform界面(技术改变世界cnblog)
    在.NET Core中使用Channel(二)
    C#中的依赖注入和IoC容器
    改进你的c#代码的5个技巧(一)
    将WCF迁移到gRPC
    在.NET Core中使用Channel(三)
    在.NET Core中使用Channel(一)
    .NET 5 源代码生成器——MediatR——CQRS
    在大型软件项目中如何处理错误和异常
    在 ASP.NET Core和Worker Service中使用Quartz.Net
  • 原文地址:https://www.cnblogs.com/kkkky/p/6379870.html
Copyright © 2020-2023  润新知