浅谈设计模式

本文详细介绍了Java中的两种常见设计模式——单例模式和工厂模式。单例模式确保一个类只有一个实例,适用于内存资源有限和需要保持数据一致性的场景。文章列举了多种单例实现方式,包括饿汉式和懒汉式,并分析了各自的优缺点。工厂模式则关注对象的创建,通过工厂方法来实例化对象,提供了更好的灵活性和扩展性。文中通过买烟的例子,展示了简单工厂、工厂方法和抽象工厂的差异和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计模式

1、常见的设计模式

我们常见的设计模式有工厂模式代理模式单例模式策略模式观察者模式包装设计模式模板方法模式等等。

我们在项目代码编写中手写代码用的比较多,一般就模板方法模式、责任链模式,策略模式、单例模式这些,像工厂模式、代理模式这一类模式手写的代码反而不多。

这一类手写的不多但是大部分我们使用的Spring框架情况下对其还是能够了解,像我们使用的打印日志方法LoggerFactory,还有我们的时间方法DateFormat在我们的框架底层已经是给我们设计好了的经常直接拿来使用的

1.1 单例模式

说到设计模式不得不提三大类中的创建型模式,该类模式下重点关注一个创建,创建什么?创建对象、创建实现过程,它的主要特点是将对象的创建与使用分离,这样在一定程度上降低系统的耦合,方便对项目进行拓展和维护。

而我们的单例模式,在有些系统中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式。

单例模式有以下3个特点:
1)单例类只有一个对象;
2)该单例对象必须由单例类自行创建;
3)单例类对外提供一个访问该单例的全局访问店。

单例模式下分:饿汉式简单懒汉式(在方法申明时加锁)DCL双重检验加锁(进阶懒汉式)静态内部类(优雅懒汉式)枚举等等。

无论是哪一种,我们都大致分两大类:饿汉式懒汉式

所谓的饿汉式指还没有被用到就提前直接初始化了对象。
所谓的懒汉式指当需要用到的时候才进行初始化。

/**
 * 饿汉买烟
 * @author HYF
 * 1、该模式的特点是类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了。
 * 2、饿汉式单例在类 创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,以后线程安全
 * 的,可以直接用于多线程而不会出现问题。
 */
public class HungryCigarette {
   
   
    private static final HungryCigarette instance = new HungryCigarette();
    private HungryCigarette(){
   
   }
    public static HungryCigarette getInstance(){
   
   
        return instance;
    }
}

/**
 * 懒汉买烟
 * @author HYF
 * 1、该模式的特点是类加载时没有生成单例,只有当第一次调用 getInstance 方法才去创建单例。
 * 2、如果编写的是多线程程序,则不要删除上例代码中的关键字 volatile 和 synchronized,
 * 否则将存在线程非安全的问题。如果不删除这两个关键字就保证线程安全,但是每次访问时都要同步,
 * 会影响性能,且小号更多的资源,这是懒汉式单例的缺点。
 */
public class LazyCigarette {
   
   
    //保证instance在所有线程中同步
    private static volatile LazyCigarette instance = null;
    //私有的,避免在外部被实例化
    private LazyCigarette(){
   
   }
    //getInstance 方法前同步
    public static synchronized LazyCigarette getInstance(){
   
   
        if (instance == null){
   
   
            instance = new LazyCigarette();
        }
        return instance;
    }
}
/**
 * DCL懒汉买烟
 * @author HYF
 * 方法加锁
 */
public class HungryCigaretteEasy {
   
   
    //这里一定要volatile修饰防止指令重排导致线程不安全的问题
    private static volatile HungryCigaretteEasy hungryCigaretteEasy = null;
    private HungryCigaretteEasy(){
   
   
    }

    public static synchronized HungryCigaretteEasy getInstance(){
   
   
        if (hungryCigaretteEasy == null){
   
   
            
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值