单例模式(Singleton Pattern)是一种常用的软件设计模式,其目的是确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。单例模式广泛应用于需要控制资源访问的场合,比如配置文件读取、数据库连接、线程池等。
public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 缺点:多线程环境下不安全。
public class Singleton { private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 缺点:效率低下,每次调用getInstance()时都需要进行线程锁定
public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } 注意:使用该结构可以确保只在第一次实例化时进行加锁操作,既保证了线程安全又提高了效率。这里使用了volatile关键字来确保多线程环境下的内存可见性(可参考文章线程安全,这里不再赘述)和禁止指令重排序(如下图)。

public class Singleton { private Singleton() {} private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } } 优点:延迟加载,且线程安全。
说明:
public enum Singleton { INSTANCE; public void whateverMethod() { } } 优点:简洁,自动支持序列化机制,绝对防止多次实例化。
选择哪种单例模式实现方式,取决于具体的应用场景和性能要求。
如果不需要延迟加载,可以优先考虑枚举方式,因为它不仅代码简洁,而且提供了自动的序列化机制,能够防止多次实例化。
如果需要延迟加载,且对性能要求较高,可以考虑使用静态内部类方式。
双重检查锁定方式适用于对性能要求不是非常苛刻,但需要保证线程安全的场景。
而简单的懒汉式和线程安全的懒汉式,则分别适用于单线程和多线程但不需要频繁访问单例的场景。
简单工厂模式(Simple Factory Pattern)是工厂模式的一种基础形式,尽管它并不属于GOF(Gang of Four)提出的23种设计模式之一,但它在面向对象的程序设计中扮演着重要的角色。以下是对简单工厂模式的详细解析:
以下是一个简单的代码示例,演示了如何使用简单工厂模式来创建不同类型的运算对象(加法、减法、乘法、除法):
// 抽象产品类 interface Operation { double getResult(); } // 具体产品类(加法) class AddOperation implements Operation { private double number1; private double number2; public AddOperation(double number1, double number2) { this.number1 = number1; this.number2 = number2; } @Override public double getResult() { return number1 + number2; } } // 其他具体产品类(减法、乘法、除法)... // 工厂类 class OperationFactory { public static Operation createOperation(String sign, double number1, double number2) { switch (sign) { case "+": return new AddOperation(number1, number2); // 其他case(减法、乘法、除法)... default: throw new IllegalArgumentException("Unsupported operation"); } } } // 客户端代码 public class Main { public static void main(String[] args) { Operation operation = OperationFactory.createOperation("+", 1, 2); System.out.println(operation.getResult()); // 输出:3 } } UML类图:
在这个示例中,Operation是抽象产品类,定义了运算的接口;AddOperation是具体产品类之一,实现了加法运算;OperationFactory是工厂类,负责根据传入的运算符来创建对应的运算对象。客户端代码通过调用工厂类的静态方法来获取运算对象,并调用其getResult方法来执行运算。
工厂方法模式(Factory Method Pattern)是计算机网络技术中一种常用的类创建型设计模式。其核心精神在于封装类中变化的部分,提取其中个性化、善变的部分为独立类。通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。以下是工厂方法模式的详细解析:
工厂方法模式的核心结构包含四个角色:
优点:
缺点:
工厂方法模式适用于以下场景:
以下是一个简单的工厂方法模式的代码实例,假设我们有一个产品接口 Product 和两个实现该接口的具体产品类 ConcreteProductA 和 ConcreteProductB。我们还有一个创建这些产品的工厂接口 Factory 和两个实现该接口的工厂类 ConcreteFactoryA 和 ConcreteFactoryB。
// 产品接口 interface Product { void use(); } // 具体产品A class ConcreteProductA implements Product { @Override public void use() { System.out.println("Using ConcreteProductA"); } } // 具体产品B class ConcreteProductB implements Product { @Override public void use() { System.out.println("Using ConcreteProductB"); } } // 工厂接口 interface Factory { Product createProduct(); } // 具体工厂A class ConcreteFactoryA implements Factory { @Override public Product createProduct() { return new ConcreteProductA(); } } // 具体工厂B class ConcreteFactoryB implements Factory { @Override public Product createProduct() { return new ConcreteProductB(); } } // 客户端代码 public class FactoryMethodDemo { public static void main(String[] args) { // 使用工厂A创建产品A Factory factoryA = new ConcreteFactoryA(); Product productA = factoryA.createProduct(); productA.use(); // 输出: Using ConcreteProductA // 使用工厂B创建产品B Factory factoryB = new ConcreteFactoryB(); Product productB = factoryB.createProduct(); productB.use(); // 输出: Using ConcreteProductB } } UML类图:
在这个例子中,Product 是一个产品接口,它有一个方法 use()。ConcreteProductA 和 ConcreteProductB 是实现了 Product 接口的具体产品类。Factory 是一个工厂接口,它定义了一个方法 createProduct(),该方法用于创建 Product 对象。ConcreteFactoryA 和 ConcreteFactoryB 是实现了 Factory 接口的具体工厂类,它们分别负责创建 ConcreteProductA 和 ConcreteProductB 的实例。
在客户端代码 FactoryMethodDemo 中,我们分别通过 ConcreteFactoryA 和 ConcreteFactoryB 创建了 ConcreteProductA 和 ConcreteProductB 的实例,并调用了它们的 use() 方法。这样,我们就实现了在客户端代码中不直接依赖于具体产品的创建细节,而是通过工厂类来创建所需的产品对象。
工厂方法模式是一种常用的设计模式,它通过定义工厂接口和具体工厂类来创建产品对象,实现了对创建过程的封装和隐藏,提高了系统的可扩展性和灵活性。然而,它也存在一些缺点,如增加系统复杂性和理解难度等。在实际应用中,需要根据具体场景和需求来选择是否使用工厂方法模式。
上一篇:什么是web应用攻击技术