应用场景区别
- 建造者模式:
- 适用于创建复杂对象的场景,该对象的创建过程包含多个步骤,且这些步骤的顺序可能很重要,或者对象的不同表示形式需要不同的创建步骤。例如,创建一个复杂的游戏角色,其创建过程可能包括设置角色的外貌、属性、技能等多个步骤,且不同职业的角色创建步骤和参数不同。
- 工厂模式:
- 用于创建对象的场景,当创建对象的逻辑较为复杂,需要根据不同条件创建不同类型的对象时使用。比如,根据用户输入的图形类型(圆形、矩形等)创建相应的图形对象,工厂模式将对象的创建和使用分离,使代码更易维护和扩展。
- 单例模式:
- 确保在整个应用程序中,某个类只有一个实例存在,并且提供一个全局访问点。常用于需要共享资源的场景,如数据库连接池、日志记录器等,保证整个系统中只有一个实例在运行,避免资源的重复创建和浪费。
实现方式区别
- 建造者模式:
- 包含一个抽象建造者接口,具体建造者实现该接口,负责对象各个部分的构建。还有一个指挥者类,它控制建造过程,调用建造者的方法按顺序构建对象。客户端与指挥者交互,指挥者调用具体建造者完成复杂对象的构建。例如:
// 抽象建造者
abstract class Builder {
abstract void buildPartA();
abstract void buildPartB();
abstract Product getResult();
}
// 具体建造者
class ConcreteBuilder extends Builder {
private Product product = new Product();
@Override
void buildPartA() {
product.add("Part A");
}
@Override
void buildPartB() {
product.add("Part B");
}
@Override
Product getResult() {
return product;
}
}
// 产品
class Product {
private List<String> parts = new ArrayList<>();
void add(String part) {
parts.add(part);
}
void show() {
System.out.println("Product parts: " + parts);
}
}
// 指挥者
class Director {
Builder builder;
Director(Builder builder) {
this.builder = builder;
}
void construct() {
builder.buildPartA();
builder.buildPartB();
}
}
- 工厂模式:
- 简单工厂模式是工厂类有一个创建对象的静态方法,根据传入的参数创建不同类型的对象。工厂方法模式是定义一个创建对象的抽象方法,由具体子类决定创建何种对象。抽象工厂模式则是创建一系列相关或相互依赖对象的工厂接口,具体工厂实现该接口创建所需对象。以简单工厂模式为例:
// 产品接口
interface Product {
void use();
}
// 具体产品
class ConcreteProduct implements Product {
@Override
void use() {
System.out.println("Using ConcreteProduct");
}
}
// 简单工厂
class SimpleFactory {
static Product createProduct(String type) {
if ("concrete".equals(type)) {
return new ConcreteProduct();
}
return null;
}
}
- 单例模式:
- 常见的实现方式有饿汉式和懒汉式。饿汉式在类加载时就创建实例,保证线程安全。懒汉式是在第一次使用时才创建实例,需要注意线程安全问题。例如饿汉式:
class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
设计哲学区别
- 建造者模式:
- 强调对象创建过程的封装和步骤的控制,将复杂对象的创建过程分解为多个简单步骤,通过不同的建造者实现可以创建不同表示形式的对象,关注对象的构建过程。
- 工厂模式:
- 重点在于对象创建的封装,将对象的创建逻辑从使用它的代码中分离出来,提高代码的可维护性和可扩展性,关注对象的创建。
- 单例模式:
- 关注对象的唯一性,确保整个系统中特定类只有一个实例,提供一种全局访问机制,主要解决资源共享和避免重复创建的问题。