Java设计模式二 - 创建型模式

1. 单例模式(Singleton Pattern)

1.1 定义

单例模式确保一个类只有一个实例,并提供一个全局访问点。

1.2 侧重点
控制类实例只有一个,节省系统资源。
提供对唯一实例的全局访问点。
1.3 使用场景
全局唯一对象: 当需要确保一个类只有一个实例,并提供全局访问点时,比如配置管理器、日志管理器等。
资源共享情况下的节约资源: 某类只应该拥有一个实例,避免创建多个实例占用过多内存,比如线程池、数据库连接池等。
1.4 示例代码(Java)
public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // Private constructor to prevent instantiation from outside.
    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    public void showMessage() {
        System.out.println("Singleton instance is created.");
    }
}

2. 工厂模式(Factory Pattern)

2.1 定义

工厂模式定义了一个创建对象的接口,但由子类决定实例化的类是哪一个。

2.2 侧重点
将对象的实例化过程封装,使客户端与具体的类解耦。
提供一个创建对象的通用接口,便于扩展和维护。
2.3 使用场景
类不知道要创建的对象类: 当一个类无法预知要创建的对象的类时,将对象的创建延迟到子类中实现,比如GUI组件的创建、日志记录器等。
2.4 示例代码(Java)
interface Product {
    void create();
}

class ConcreteProduct1 implements Product {
    @Override
    public void create() {
        System.out.println("Product 1 is created.");
    }
}

class ConcreteProduct2 implements Product {
    @Override
    public void create() {
        System.out.println("Product 2 is created.");
    }
}

class ProductFactory {
    public static Product createProduct(String type) {
        if (type.equals("Product1")) {
            return new ConcreteProduct1();
        } else if (type.equals("Product2")) {
            return new ConcreteProduct2();
        }
        return null;
    }
}

3. 抽象工厂模式(Abstract Factory Pattern)

3.1 定义

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定具体的类。

3.2 侧重点
创建一组相关的产品对象,便于替换整个产品族。
保持产品间的一致性,确保创建的产品是相互兼容的。
3.3 使用场景
产品族概念的应用: 当需要创建一组相关或相互依赖的对象时,可以使用抽象工厂模式,比如创建不同操作系统下的界面组件。
系统需要独立于其产品的创建、组合和表示时: 可以使用抽象工厂模式将系统与具体类的实现分离。
3.4 示例代码(Java)
interface AbstractProductA {
    void create();
}

class ProductA1 implements AbstractProductA {
    @Override
    public void create() {
        System.out.println("Product A1 is created.");
    }
}

class ProductA2 implements AbstractProductA {
    @Override
    public void create() {
        System.out.println("Product A2 is created.");
    }
}

interface AbstractProductB {
    void create();
}

class ProductB1 implements AbstractProductB {
    @Override
    public void create() {
        System.out.println("Product B1 is created.");
    }
}

class ProductB2 implements AbstractProductB {
    @Override
    public void create() {
        System.out.println("Product B2 is created.");
    }
}

interface AbstractFactory {
    AbstractProductA createProductA();
    AbstractProductB createProductB();
}

class ConcreteFactory1 implements AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ProductA1();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ProductB1();
    }
}

class ConcreteFactory2 implements AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ProductA2();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ProductB2();
    }
}

4. 建造者模式(Builder Pattern)

4.1 定义

建造者模式将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。

4.2 侧重点
将对象的构建过程拆分成多个步骤,便于灵活组合和构建不同的对象。
隐藏对象的构建细节,使客户端只需关心配置和组装顺序。
4.3 使用场景
创建对象的构建过程比较复杂: 当对象的构建过程较为复杂,需要将构建过程拆分成多个步骤,并且可以灵活组装不同的部分时,可以使用建造者模式,比如创建复杂的数据结构、报表等。
4.4 示例代码(Java)
class Product {
    private String part1;
    private String part2;

    public void setPart1(String part1) {
        this.part1 = part1;
    }

    public void setPart2(String part2) {
        this.part2 = part2;
    }

    public void show() {
        System.out.println("Product parts: " + part1 + " and " + part2);
    }
}

interface Builder {
    void buildPart1();
    void buildPart2();
    Product getResult();
}

class ConcreteBuilder implements Builder {
    private Product product = new Product();

    @Override
    public void buildPart1() {
        product.setPart1("Part 1");
    }

    @Override
    public void buildPart2() {
        product.setPart2("Part 2");
    }

    @Override
    public Product getResult() {
        return product;
    }
}

class Director {
    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public void construct() {
        builder.buildPart1();
        builder.buildPart2();
    }
}

5. 原型模式(Prototype Pattern)

5.1 定义

原型模式通过复制现有实例来创建新实例。

5.2 侧重点
通过复制现有对象来创建新对象,避免了重复的初始化和构造过程。
提供一种简洁的创建对象的方式,适用于对象的创建成本较高的情况。
5.3 使用场景

创建成本较高,但复制比较简单: 当对象的创建过程较为复杂或创建成本较高,但对象的复制比较简单时,可以使用原型模式,通过复制现有实例来创建新实例,提高效率。

5.4 示例代码(Java)
class ConcretePrototype implements Cloneable {
    @Override
    public ConcretePrototype clone() {
        try {
            return (ConcretePrototype) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }
}

public class PrototypeExample {
    public static void main(String[] args) {
        ConcretePrototype prototype = new ConcretePrototype();

        ConcretePrototype clonedPrototype1 = prototype.clone();
        System.out.println("Cloned Prototype 1: " + clonedPrototype1);

        ConcretePrototype clonedPrototype2 = prototype.clone();
        System.out.println("Cloned Prototype 2: " + clonedPrototype2);
    }
}

以上是创建型模式的详解和示例代码。每种模式都有其特定的用途和适用场景,根据具体的开发需求选择合适的模式来提高代码质量

版权声明: 闲者 发表于 2024-08-06
转载请注明: Java设计模式二 - 创建型模式 | Java设计模式二 - 创建型模式 - 无界文档,Java设计模式二 - 创建型模式

评论区

暂无评论...