1. 单例模式(Singleton Pattern):
确保一个类只有一个实例,并提供一个全局访问点。
public class Singleton { private static Singleton instance; private Singleton() { // 私有构造方法,防止外部实例化 } public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
此外,还有使用枚举(Enum)的写法,一种简单而线程安全的方式
public enum SingletonEnum { INSTANCE; // 可以在枚举中定义其他成员变量和方法 // 例如: // private int value; // 枚举的构造方法默认是私有的,确保单例 private SingletonEnum() { // 初始化操作 } // 可以在枚举中定义其他方法 // 例如: // public void doSomething() { // // 实现方法逻辑 // } } // .... 使用方法 public class Main { public static void main(String[] args) { // 获取单例实例 SingletonEnum instance1 = SingletonEnum.INSTANCE; SingletonEnum instance2 = SingletonEnum.INSTANCE; // 验证是否为同一实例 System.out.println(instance1 == instance2); // 输出 true } }
在这里,INSTANCE
是一个枚举类型的实例,它在加载时被初始化,并且由于枚举类型的特性,它确保了线程安全和单例实例的唯一性。这是一种简洁而安全的单例模式实现方式。
2. 抽象工厂模式(Abstract Factory Pattern):
定义一个用于创建对象的接口,但由子类决定实例化哪个类。
// 抽象产品 interface Product { void create(); } // 具体产品 class ConcreteProductA implements Product { public void create() { System.out.println("Product A created"); } } class ConcreteProductB implements Product { public void create() { System.out.println("Product B created"); } } // 抽象工厂 interface Factory { Product createProduct(); } // 具体工厂 class ConcreteFactoryA implements Factory { public Product createProduct() { return new ConcreteProductA(); } } class ConcreteFactoryB implements Factory { public Product createProduct() { return new ConcreteProductB(); } }
3. 工厂方法模式(Factory Method Pattern)
// 抽象产品 interface Product { void create(); } // 具体产品 A class ConcreteProductA implements Product { public void create() { System.out.println("Product A created"); } } // 具体产品 B class ConcreteProductB implements Product { public void create() { System.out.println("Product B created"); } } // 工厂接口 interface Factory { Product createProduct(); } // 具体工厂 A class ConcreteFactoryA implements Factory { public Product createProduct() { return new ConcreteProductA(); } } // 具体工厂 B class ConcreteFactoryB implements Factory { public Product createProduct() { return new ConcreteProductB(); } } // 客户端代码 public class Client { public static void main(String[] args) { // 通过具体工厂 A 创建产品 A Factory factoryA = new ConcreteFactoryA(); Product productA = factoryA.createProduct(); productA.create(); // 通过具体工厂 B 创建产品 B Factory factoryB = new ConcreteFactoryB(); Product productB = factoryB.createProduct(); productB.create(); } }
4. 简单工厂模式
简单工厂模式(Simple Factory Pattern)是工厂模式的一种简化形式。在简单工厂模式中,一个工厂类负责创建多个产品类的实例,客户端通过工厂类来创建所需的对象,而不直接实例化具体的产品类。下面是简单工厂模式的一个简单示例:
// 抽象产品 interface Product { void create(); } // 具体产品 A class ConcreteProductA implements Product { public void create() { System.out.println("Product A created"); } } // 具体产品 B class ConcreteProductB implements Product { public void create() { System.out.println("Product B created"); } } // 简单工厂类 class SimpleFactory { public static Product createProduct(String type) { if ("A".equals(type)) { return new ConcreteProductA(); } else if ("B".equals(type)) { return new ConcreteProductB(); } else { throw new IllegalArgumentException("Invalid product type"); } } } // 客户端代码 public class Client { public static void main(String[] args) { // 通过简单工厂创建产品 A Product productA = SimpleFactory.createProduct("A"); productA.create(); // 通过简单工厂创建产品 B Product productB = SimpleFactory.createProduct("B"); productB.create(); } }
5. 建造者模式
建造者模式是一种创建型设计模式,用于创建复杂对象。它允许你逐步构造一个对象,同时隐藏构建细节。这有助于将构造复杂对象的过程与其表示相分离,使得同样的构建过程可以创建不同的表示。
动机:Client(使用者)只想知道怎么用,但不想知道具体细节的情况。
建造者模式包含以下主要角色:
Director(指挥者):负责构建复杂对象。Director 将具体的构建步骤委托给 Builder 接口来执行。
Builder(构建者):定义构建复杂对象各个部分的接口,通常包括构建部件的方法和返回最终产品的方法。
ConcreteBuilder(具体构建者):实现 Builder 接口,负责构建复杂对象的各个部分,并提供一个方法返回构建好的对象。
Product(产品):表示被构建的复杂对象。通常包含多个部分。
下面是一个简单的示例,以创建一个包含不同属性的计算机为例:
// 产品类 class Computer { private String cpu; private String memory; private String storage; // 构造方法私有,防止直接实例化 private Computer() { } // Getter 方法... // 静态内部类,负责构建 Computer 对象 static class ComputerBuilder { private Computer computer = new Computer(); // 设置 CPU ComputerBuilder setCpu(String cpu) { computer.cpu = cpu; return this; } // 设置内存 ComputerBuilder setMemory(String memory) { computer.memory = memory; return this; } // 设置存储 ComputerBuilder setStorage(String storage) { computer.storage = storage; return this; } // 构建最终的 Computer 对象 Computer build() { return computer; } } } // 指挥者类 class Director { // 指挥者通过 Builder 构建复杂对象 Computer construct(Computer.ComputerBuilder builder) { return builder .setCpu("Intel i7") .setMemory("16GB") .setStorage("512GB SSD") .build(); } } public class BuilderPatternExample { public static void main(String[] args) { // 客户端通过指挥者来构建对象 Director director = new Director(); Computer.ComputerBuilder builder = new Computer.ComputerBuilder(); Computer computer = director.construct(builder); // 客户端得到构建好的对象 System.out.println("Computer details: " + computer); } }
在上述例子中,Computer
是产品类,Computer.ComputerBuilder
是具体构建者,Director
是指挥者。通过调用指挥者的 construct
方法,客户端可以得到一个构建好的 Computer
对象。建造者模式的主要优点是,客户端可以更加灵活地构建对象,可以选择性地设置属性,而不需要关心构建的具体细节。
在Lombok中,我们同样可以使用@Builder实现建造者模式。