设计模式(二)

record-100 / 2024-10-13 / 原文

第一类模式:创建者模式

  创建型模式的主要关注点是“怎么样创建对象?”,它的主要关注点是“将对象的创建与使用分离”。

  这样可以降低系统的耦合度,使用者不需要关注 对象的创建细节。

创建型模式分为:

  单例模式

  工厂方法模式

  抽象工程模式

  原型模式

  建造者模式

单例设计模式

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

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

单例模式的结构

单例模式主要有以下角色:

  单例类。只能创建一个实例的类

  访问类。使用单例类

单例模式的实现

单例设计模式分类两种:

  饿汉式:类加载就会导致该单实例对象被创建

  懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时才会创建

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

 1 package com.itheima.pattern.singleton.demo1;
 2 
 3 /**
 4  * 创建者模式-单例设计模式
 5  * 饿汉式:静态成员变量
 6  */
 7 public class Singleton {
 8 
 9     // 1、私有构造方法
10     private Singleton() {}
11 
12     // 2、在本类中创建本类对象
13     private static Singleton singleton = new Singleton();
14 
15     // 3、提供一个公共的访问方式,让外界获取该对象
16     public static Singleton getInstance() {
17         return singleton;
18     }
19 }
 1 package com.itheima.pattern.singleton.demo1;
 2 
 3 /**
 4  * 创建者模式-单例设计模式
 5  * 饿汉式:静态成员变量
 6  */
 7 public class Client {
 8     public static void main(String[] args) {
 9         // 创建Singleton类对象
10         Singleton singleton1 = Singleton.getInstance();
11         Singleton singleton2 = Singleton.getInstance();
12         // 判断获取到的两个对象是否是同一个对象
13         System.out.println(singleton1 == singleton2);
14     }
15 }

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

饿汉式-方式2(静态代码块方式)

 1 package com.itheima.pattern.singleton.demo2;
 2 
 3 /**
 4  * 创建者模式-单例设计模式
 5  * 饿汉式:静态代码块
 6  */
 7 public class Singleton {
 8 
 9     // 1、私有构造方法
10     private Singleton() {}
11 
12     // 2、声明Singleton类型的变量
13     private static Singleton singleton;
14 
15     // 3、在静态代码块中进行赋值
16     static {
17         singleton = new Singleton();
18     }
19 
20     // 4、提供一个公共的访问方式,让外界获取该对象
21     public static Singleton getInstance() {
22         return singleton;
23     }
24 }
 1 package com.itheima.pattern.singleton.demo2;
 2 
 3 /**
 4  * 创建者模式-单例设计模式
 5  * 饿汉式:静态代码块
 6  * 测试类
 7  */
 8 public class Client {
 9     public static void main(String[] args) {
10         // 创建Singleton类对象
11         Singleton singleton1 = Singleton.getInstance();
12         Singleton singleton2 = Singleton.getInstance();
13         // 判断获取到的两个对象是否是同一个对象
14         System.out.println(singleton1 == singleton2);
15     }
16 }

该方式在成员位置声明Singleton类型的静态变量,而对象的创建是在静态代码块中,也是随着类的加载而创建。所以和饿汉式的方式1基本一样,当然该方式也存在内存浪费问题。