ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

单例模式

2022-04-10 22:33:46  阅读:150  来源: 互联网

标签:name getInstance 模式 Cat static 单例 GirlFriend public


单例模式

单例(单个的实例)
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例, 并且该类只提供一个取得其对象实例的方法

  1. 单例模式的两种实现方式 :(1)饿汉式 (2)懒汉式

    • 饿汉式(步骤)

      1. 构造器私有化

        • private Person(String name) {
            this.name = name;
              }
          
      2. 类的内部创建static对象

        • private static Person person = new Person(name);
          
      3. 向外提供一个静态的方法,返回 一个对象

        • public static Person getInstance(){
            return person;
              }
          

        代码

        public static void main(String[] args) { 
          // GirlFriend xh = new GirlFriend("小红"); 
          // GirlFriend xb = new GirlFriend("小白"); 
          //通过方法可以获取对象 
          GirlFriend instance = GirlFriend.getInstance(); 
          System.out.println(instance);
          GirlFriend instance2 = GirlFriend.getInstance(); 
          System.out.println(instance2); 
          System.out.println(instance == instance2);//T 
          //System.out.println(GirlFriend.n1); //...
        }
        //有一个类, GirlFriend 
        //只能有一个女朋友 
        class GirlFriend { 
          private String name;
         //public static int n1 = 100;
          //为了能够在静态方法中,返回 gf 对象,需要将其修饰为 static 
          //對象,通常是重量級的對象, 餓漢式可能造成創建了對象,但是沒有使用. 
          private static GirlFriend gf = new GirlFriend("小红红"); 
          //如何保障我们只能创建一个 GirlFriend 对象 
          //步骤[单例模式-饿汉式] 
          //1. 将构造器私有化 
          //2. 在类的内部直接创建对象(该对象是 static)
          //3. 提供一个公共的 static 方法,返回 gf 对象 
          private GirlFriend(String name) { 
            System.out.println("構造器被調用."); 
            this.name = name; 
          }
          public static GirlFriend getInstance() {
            return gf; 
          }
          @Override public String toString() { 
            return "GirlFriend{" + "name='" + name + '\'' + '}';
          } 
        }
        
    • 懒汉式(步骤)

      1. 构造器私有化

         private Person(String name) {
          this.name = name;
            }
        
      2. 定义一个static静态属性对象,不直接new。静态的随着类的加载只会执行一次

        • private static Person person;
          
      3. 提供一个公共的pubilc的static方法,用来返回一个person对象(加入一个判断条件:判断person对象 是否为空)

        • public static Person getInstance(){
            if (person == null){
               person = new Person(name);
              }
               return person;
          }
          

        代码

        public class SingleTon02 { 
          public static void main(String[] args) { 
            //new Cat("大黃"); 
            //System.out.println(Cat.n1); 
            Cat instance = Cat.getInstance(); 
            System.out.println(instance); 
            //再次調用 
            getInstance Cat instance2 = Cat.getInstance(); 
            System.out.println(instance2); 
            System.out.println(instance == instance2);//T 
          } 
        }
        //希望在程序運行過程中,只能創建一個 Cat 對象 
        //使用單例模式
        class Cat {
          private String name; 
          public static int n1 = 999;
          private static Cat cat ; //默認是 null 
          //步驟
          //1.仍然構造器私有化 
          //2.定義一個 static 静态属性对象
          //3.提供一個 public 的 static 方法,可以返回一個 Cat 對象
          //4.懶漢式,只有當用戶使用 getInstance 時,才返回 cat 對象, 後面再次調用時,會返回上次創建的 cat 對象 
          // 從而保證了單例 
          private Cat(String name) { 
            System.out.println("構造器調用...");
            this.name = name;
          }
          public static Cat getInstance() {
            if(cat == null) {//如果還沒有創建 cat 對象 
              cat = new Cat("小可愛"); 
            }
            return cat; 
          }
          @Override public String toString() { 
            return "Cat{" + "name='" + name + '\'' + '}';
          }
        
  2. 饿汉式的问题:在类加载的时候就创建对象,会导致创建了对象但是没有使用,可能存在资源浪费问题

  3. 懒汉式的问题:存在线程安全问题

标签:name,getInstance,模式,Cat,static,单例,GirlFriend,public
来源: https://www.cnblogs.com/tzkf/p/16127861.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有