单例模式是一种创建型设计模式,其主要目的是确保类只有一个实例,并提供一个全局访问点。这在需要严格控制某个类只能有一个实例时非常有用,例如线程池、配置管理和日志记录器等。
实现单例模式有多种方式,常见的包括懒汉式、饿汉式、双重检查锁等。以下是一个基于双重检查锁的线程安全单例模式的示例代码:
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;
}
}
优点:
缺点:
单例模式在实际项目中有许多应用场景,例如:
在以上场景中,单例模式可以有效地管理资源和状态,提高系统的性能和可维护性。
工厂模式是一种创建型设计模式,其主要目的是封装对象的创建过程,并根据需求动态返回对象实例。工厂模式可以根据不同的条件创建不同类型的对象,从而提高代码的灵活性和可扩展性。
简单工厂模式是工厂模式的一种简单形式,其通过一个工厂类负责创建对象实例,客户端无需直接创建对象。以下是一个简单工厂模式的示例代码:
public class SimpleFactory {
public static Product createProduct(String type) {
if ("A".equals(type)) {
return new ConcreteProductA();
} else if ("B".equals(type)) {
return new ConcreteProductB();
}
throw new IllegalArgumentException("Invalid product type: " + type);
}
}
interface Product {
void operation();
}
class ConcreteProductA implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductA operation");
}
}
class ConcreteProductB implements Product {
@Override
public void operation() {
System.out.println("ConcreteProductB operation");
}
}
工厂方法模式是一种将对象的创建延迟到子类的模式,其定义了一个创建对象的接口,由子类决定要实例化的类。工厂方法模式可以在不修改现有代码的情况下引入新的产品类。
public interface Factory {
Product createProduct();
}
public class ConcreteFactoryA implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
public class ConcreteFactoryB implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
抽象工厂模式是一种提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类的模式。抽象工厂模式可以在不修改现有代码的情况下引入新的产品族。
public interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
public class ConcreteFactory1 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB1();
}
}
public class ConcreteFactory2 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB2();
}
}
优点:
缺点:
抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。抽象工厂模式通过工厂接口和具体工厂类来实现对象的创建,客户端可以通过工厂接口获取所需的产品对象,而无需关心具体的实现细节。
抽象工厂模式是工厂方法模式的扩展,它提供了一种方式来创建一系列相关或相互依赖的对象。通过定义一组工厂接口和具体的工厂实现类,抽象工厂模式可以使得系统更加灵活,并且符合开闭原则,即对扩展开放,对修改关闭。
抽象工厂模式由以下几个要素组成:
// 抽象工厂接口
public interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
// 具体工厂类1
public class ConcreteFactory1 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB1();
}
}
// 具体工厂类2
public class ConcreteFactory2 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB2();
}
}
优点:
缺点:
建造者模式是一种创建型设计模式,它可以将一个复杂对象的构建过程和表示分离,使得同样的构建过程可以创建不同的表示。通过建造者模式,客户端可以更加灵活地创建复杂对象,同时也可以隐藏对象的构建细节。
建造者模式的核心思想是将一个复杂对象的构建过程分解为多个简单的步骤,然后由指挥者按照一定的顺序组合这些步骤来构建对象。建造者模式可以在不同的构建过程中使用相同的建造者接口,从而创建不同的表示形式。
建造者模式由以下几个要素组成:
// 产品类
public class Product {
private String partA;
private String partB;
private String partC;
// 省略getter和setter方法
}
// 建造者接口
public interface Builder {
void buildPartA();
void buildPartB();
void buildPartC();
Product getResult();
}
// 具体建造者类
public class ConcreteBuilder implements Builder {
private Product product = new Product();
@Override
public void buildPartA() {
product.setPartA("Part A");
}
@Override
public void buildPartB() {
product.setPartB("Part B");
}
@Override
public void buildPartC() {
product.setPartC("Part C");
}
@Override
public Product getResult() {
return product;
}
}
// 指挥者类
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public Product construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getResult();
}
}
原型模式是一种创建型设计模式,旨在通过复制现有对象来创建新对象,而无需知道其具体类型。该模式通过克隆现有对象的属性和状态来创建新对象,避免了直接使用构造函数创建对象时的重复性工作。
原型模式适用于需要创建大量相似对象的场景,通过复制现有对象来创建新对象,可以提高对象的创建效率,并且避免了因为重复构造对象导致的性能损耗。同时,原型模式也可以保护对象的状态,因为新对象是从现有对象的副本中创建的,不会影响原始对象的状态。
原型模式包括以下几个要素:
// 抽象原型类
public interface Prototype {
Prototype clone();
}
// 具体原型类
public class ConcretePrototype implements Prototype {
private String property;
public ConcretePrototype(String property) {
this.property = property;
}
@Override
public Prototype clone() {
return new ConcretePrototype(this.property);
}
}
// 客户端
public class Client {
public static void main(String[] args) {
// 创建原型对象
ConcretePrototype prototype = new ConcretePrototype("Initial Property");
// 克隆原型对象
ConcretePrototype clone = (ConcretePrototype) prototype.clone();
// 输出克隆对象的属性
System.out.println("Cloned Property: " + clone.getProperty());
}
}