ICode9

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

一个案例搞懂工厂模式和单例模式

2022-08-05 16:03:57  阅读:154  来源: 互联网

标签:模式 instance 实例 static 单例 new 搞懂


一个案例搞懂工厂模式和单例模式

1 单例模式

  • 一个对象只有一个实例
  • 单例类必须自己创建自己的唯一实例。
  • 单例类必须给所有其他对象提供这一实例。

注意:所有的单例模式,应当使其构造方法私有化。

1.1 饿汉单例模式

所谓饿汉单例:就是指在类被加载时就创建自己的唯一实例。

/**
 * @author look-word
 *
 * 饿汉式(立即加载)
 */
public class HungrySingleton {

    // 构造方法私有化
    private HungrySingleton() {}

    // 将自身实例化对象设置为一个属性,并用static、final修饰
    private static final HungrySingleton instance = new HungrySingleton();

    // 静态方法返回该实例
    public static HungrySingleton getInstance() {
        return instance;
    }
}

1.2 懒汉单例模式

所谓懒汉单例模式:在使用该类时,才创建实例对象。

  • 注意:需要加上线程同步关键字
  • 可能会存在线程安全问题,多个线程同时调用
/**
 * @author 应癫
 */
public class LazySingleton {

    // 将自身实例化对象设置为一个属性,并用static修饰
    private static LazySingleton instance;

    // 构造方法私有化
    private LazySingleton() {}

    // 静态方法返回该实例,加synchronized关键字实现同步
    public static synchronized LazySingleton getInstance() {
        if(instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}
名称 优点 缺点
饿汉单例模式 多线程安全,没有加锁执行效率高。 类加载时就初始化,浪费内存。
懒汉单例模式 第一次调用才初始化,避免内存浪费。 必须加锁 synchronized 才能保证单例,但加锁会影响效率。

2 工厂模式

img

        /**
         *  一开始,穷,想吃面必须得自己做
         *  想吃拉面得自己做,new LzNoodles()
         *  想吃泡面得自己做,new PaoNoodles()
         *  想吃热干面得自己做,new ReganNoodles()
         */
        // 做拉面吃
        INoodles lzNoodles = new LzNoodles();
        // 做泡面吃
        // INoodles paoNoodles = new PaoNoodles();
        // 做热干面吃
        // INoodles reganNoodles = new ReganNoodles();

        // 然而,new来new去,改来改去,好心烦......

img

        /**
         * 忽然,有一天走了狗屎运成了暴发户
         * 幸福生活从此来临,吃面从此变得简单
         * 给面馆说一声想吃啥,面馆做好了给自己就好了
         * 自己不必关心面条怎么做(怎么new,如何new)让面馆操心去吧(面馆帮我们new)!
         * 好省心,有钱就是好,太爽了!
         */
        INoodles iNoodles = SimpleNoodlesFactory.createNoodles(2);  // 和具体的对象脱离关系
        iNoodles.desc();

再进行演变: 考虑使用工厂模式,给个工厂生产自己的专属面条,需要吃那个创建即可。

  • 工厂是负责创建对象

img

标签:模式,instance,实例,static,单例,new,搞懂
来源: https://www.cnblogs.com/look-word/p/16554630.html

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

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

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

ICode9版权所有