设计模式--单例模式 工厂模式

本文详细介绍了设计模式中的单例模式和工厂模式。单例模式是一种创建型模式,保证类只有一个实例,适用于需要频繁创建和销毁的对象。文章详细讲解了单例模式的多种实现方式,包括饿汉式、懒汉式,以及解决线程安全问题的双重检查锁模式。同时,还探讨了单例模式的优缺点。工厂模式则是将对象的创建过程封装起来,提供一个接口来创建对象,分为简单工厂模式、工厂方法模式和抽象工厂模式。通过工厂方法模式和抽象工厂模式,可以实现对象创建的灵活性和开闭原则。
摘要由CSDN通过智能技术生成

1设计模式

1.1什么是设计模式

软件设计模式(Software Design Pattern),又称设计模式,是一套被==反复使用==、==多数人知晓的==、==代码设计经验的总结==。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是==前辈们的代码设计经验的总结==,具有一定的普遍性,可以反复使用。

1.2 设计模式的种类23种

  • 创建型模式

    用于描述“怎样创建对象”,它的主要特点是“==将对象的创建与使用分离==”。GoF(四人组)书中提供了==单例、原型、工厂方法、抽象工厂、建造者==等 5 种创建型模式。

  • 结构型模式

    用于描述如何将类或对象按某种布局组成更大的结构,GoF(四人组)书中提供了==代理适配器、桥接、装饰、外观、享元、组合==等 7 种结构型模式。

  • 行为型模式

    用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责。GoF(四人组)书中提供了==模板方法策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器==等 11 种行为型模式。

1.3 单例模式

  1. 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于==创建型模式==,它提供了一种==创建对象的最佳方式==。

    这种模式涉及到一个单一的类,==该类负责创建自己的对象==,同时==确保只有单个对象被创建==。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

  2. 单例模式的创建方式

第一种:饿汉式--->不管是否使用该对象,该类会直接创建。

第二种: 懒汉式--->当使用到该对象在创建

饿汉式-方式1(静态变量方式)

package com.qy151;

/**
 * @BelongsProject: 0912-设计模式
 * @BelongsPackage: com.qy151
 * @unthor : YSH
 * @date : 2022/9/13 14:42
 */
public class 饿汉式 {
    public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        Singleton s3 = Singleton.getInstance();
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
    }
}


//创建一个单列类
class Singleton{
    //构造私有方法
    private  Singleton(){};


    //创建一个本类的对象---static:随着类的加在而被加在到内存而且只会加载一次
    private static Singleton singleton=new Singleton();

    //静态方法
    public static Singleton getInstance(){
        return singleton;
    }

}

<font color='red'>说明:</font>

​ 该方式在成员位置声明Singleton类型的静态变量,并创建Singleton类的对象instance。instance对象是随着类的加载而创建的。如果该对象足够大的话,而一直没有使用就会造成内存的浪费。

2.懒汉式-方式1(线程不安全)

package com.qy151;

/**
 * @BelongsProject: 0912-设计模式
 * @BelongsPackage: com.qy151
 * @unthor : YSH
 * @date : 2022/9/13 19:19
 * 线程不安全
 *
 * 从上面代码我们可以看出该方式在成员位置声明Singleton类型的静态变量,
 * 并没有进行对象的赋值操作,那么什么时候赋值的呢?当调用getInstance()方法获取Singleton类的对象的时候才创建Singleton类的对象,
 * 这样就实现了懒加载的效果。但是,如果是多线程环境,会出现线程安全问题。
 */
public class 懒汉式01 {
    public static void main(String[] args) {
        Singleton01 s1 = Singleton01.getInstance();
        Singleton01 s2 = Singleton01.getInstance();
        System.out.println(s1);
        System.out.println(s2);
    }
}
//创建一个单例类
class Singleton01{
    //构造方法私有化---
    private Singleton01(){}

    //创建一个本类的对象---static:随着类的加在而被加在到内存而且只会加载一次
    private static Singleton01 singleton;

    //静态方法 返回本类创建的类对象
    public static Singleton01 getInstance(){
         if(singleton==null){
             singleton=new Singleton01();
         }
         return singleton;
    }
}

从上面代码我们可以看出该方式在成员位置声明Singleton类型的静态变量,并没有进行对象的赋值操作,那么什么时候赋值的呢?当调用getInstance()方法获取Singleton类的对象的时候才创建Singleton类的对象,这样就实现了懒加载的效果。但是,如果是多线程环境,会出现线程安全问题。

懒汉式-方式2(线程安全)

package com.qy151;

/**
 * @BelongsProject: 0912-设计模式
 * @BelongsPackage: com.qy151
 * @unthor : YSH
 * @date : 2022/9/13 19:32
 *
 * 进行加锁&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值