创建型设计模式

January 04, 2025 作者: southern 分类: 浏览: 9 评论: 0

创建型设计模式主要关注对象的创建过程,旨在使系统独立于对象的创建、组合和表示。这类模式通过抽象实例化过程,帮助我们在系统中灵活地创建对象,而不必依赖于具体的类。创建型设计模式包括以下几种:

  1. 单例模式(Singleton Pattern)

  2. 工厂方法模式(Factory Method Pattern)

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

  4. 建造者模式(Builder Pattern)

  5. 原型模式(Prototype Pattern)

1. 单例模式

单例模式就像是一个国家的总统,无论你在哪里访问总统,你访问的都是同一个人。总统是唯一的,且全局可访问。

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

public class President {
    // 私有静态实例,确保唯一性
    private static President instance;
​
    // 私有构造函数,防止外部实例化
    private President() {}
​
    // 全局访问点
    public static President getInstance() {
        if (instance == null) {
            instance = new President();
        }
        return instance;
    }
​
    public void speak() {
        System.out.println("I am the President.");
    }
}
​
// 使用单例模式
public class Main {
    public static void main(String[] args) {
        President president = President.getInstance();
        president.speak();  // 输出: I am the President.
    }
}

2. 工厂方法模式

工厂方法模式就像是一个汽车制造厂,不同的工厂生产不同的汽车型号。你不需要知道具体的制造过程,只需要告诉工厂你需要什么类型的汽车。

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

// 产品接口
interface Car {
    void drive();
}
​
// 具体产品
class Sedan implements Car {
    @Override
    public void drive() {
        System.out.println("Driving a Sedan.");
    }
}
​
class SUV implements Car {
    @Override
    public void drive() {
        System.out.println("Driving an SUV.");
    }
}
​
// 工厂接口
interface CarFactory {
    Car createCar();
}
​
// 具体工厂
class SedanFactory implements CarFactory {
    @Override
    public Car createCar() {
        return new Sedan();
    }
}
​
class SUVFactory implements CarFactory {
    @Override
    public Car createCar() {
        return new SUV();
    }
}
​
// 使用工厂方法模式
public class Main {
    public static void main(String[] args) {
        CarFactory sedanFactory = new SedanFactory();
        Car sedan = sedanFactory.createCar();
        sedan.drive();  // 输出: Driving a Sedan.
​
        CarFactory suvFactory = new SUVFactory();
        Car suv = suvFactory.createCar();
        suv.drive();  // 输出: Driving an SUV.
    }
}

3. 抽象工厂模式

抽象工厂模式就像一个家具厂,它可以生产一系列相关的产品,比如椅子、桌子和沙发。你不需要关心具体的生产过程,只需要选择你想要的家具风格(现代、古典等)。

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

// 产品接口
interface Chair {
    void sitOn();
}
​
interface Table {
    void putOn();
}
​
// 具体产品
class ModernChair implements Chair {
    @Override
    public void sitOn() {
        System.out.println("Sitting on a Modern Chair.");
    }
}
​
class ModernTable implements Table {
    @Override
    public void putOn() {
        System.out.println("Putting something on a Modern Table.");
    }
}
​
class ClassicChair implements Chair {
    @Override
    public void sitOn() {
        System.out.println("Sitting on a Classic Chair.");
    }
}
​
class ClassicTable implements Table {
    @Override
    public void putOn() {
        System.out.println("Putting something on a Classic Table.");
    }
}
​
// 抽象工厂接口
interface FurnitureFactory {
    Chair createChair();
    Table createTable();
}
​
// 具体工厂
class ModernFurnitureFactory implements FurnitureFactory {
    @Override
    public Chair createChair() {
        return new ModernChair();
    }
​
    @Override
    public Table createTable() {
        return new ModernTable();
    }
}
​
class ClassicFurnitureFactory implements FurnitureFactory {
    @Override
    public Chair createChair() {
        return new ClassicChair();
    }
​
    @Override
    public Table createTable() {
        return new ClassicTable();
    }
}
​
// 使用抽象工厂模式
public class Main {
    public static void main(String[] args) {
        FurnitureFactory modernFactory = new ModernFurnitureFactory();
        Chair modernChair = modernFactory.createChair();
        Table modernTable = modernFactory.createTable();
        modernChair.sitOn();  // 输出: Sitting on a Modern Chair.
        modernTable.putOn();  // 输出: Putting something on a Modern Table.
​
        FurnitureFactory classicFactory = new ClassicFurnitureFactory();
        Chair classicChair = classicFactory.createChair();
        Table classicTable = classicFactory.createTable();
        classicChair.sitOn();  // 输出: Sitting on a Classic Chair.
        classicTable.putOn();  // 输出: Putting something on a Classic Table.
    }
}

4. 建造者模式

建造者模式就像是一个建筑工地的项目经理,他负责协调各个工人(如木工、电工、水管工)来建造一栋房子。项目经理不需要知道每个工人的具体工作细节,只需要确保房子按照设计图纸一步步建造完成。

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

// 产品类
class House {
    private String foundation;
    private String structure;
    private String roof;
​
    public void setFoundation(String foundation) {
        this.foundation = foundation;
    }
​
    public void setStructure(String structure) {
        this.structure = structure;
    }
​
    public void setRoof(String roof) {
        this.roof = roof;
    }
​
    @Override
    public String toString() {
        return "House [foundation=" + foundation + ", structure=" + structure + ", roof=" + roof + "]";
    }
}
​
// 抽象建造者
interface HouseBuilder {
    void buildFoundation();
    void buildStructure();
    void buildRoof();
    House getHouse();
}
​
// 具体建造者
class ConcreteHouseBuilder implements HouseBuilder {
    private House house;
​
    public ConcreteHouseBuilder() {
        this.house = new House();
    }
​
    @Override
    public void buildFoundation() {
        house.setFoundation("Concrete Foundation");
    }
​
    @Override
    public void buildStructure() {
        house.setStructure("Concrete Structure");
    }
​
    @Override
    public void buildRoof() {
        house.setRoof("Concrete Roof");
    }
​
    @Override
    public House getHouse() {
        return this.house;
    }
}
​
// 导演类
class ConstructionEngineer {
    private HouseBuilder houseBuilder;
​
    public ConstructionEngineer(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }
​
    public House constructHouse() {
        houseBuilder.buildFoundation();
        houseBuilder.buildStructure();
        houseBuilder.buildRoof();
        return houseBuilder.getHouse();
    }
}
​
// 使用建造者模式
public class Main {
    public static void main(String[] args) {
        HouseBuilder builder = new ConcreteHouseBuilder();
        ConstructionEngineer engineer = new ConstructionEngineer(builder);
        House house = engineer.constructHouse();
        System.out.println(house);  // 输出: House [foundation=Concrete Foundation, structure=Concrete Structure, roof=Concrete Roof]
    }
}

5. 原型模式

原型模式就像是一个复印机,你可以通过复印机复制一份已经存在的文档,而不需要重新手写一遍。复印机通过复制现有的文档来生成新的文档。

原型模式通过复制现有的实例来创建新的实例,而不是通过新建类的方式。它通常用于创建成本较高的对象。

// 原型接口
interface Prototype {
    Prototype clone();
}
​
// 具体原型
class Document implements Prototype {
    private String content;
​
    public Document(String content) {
        this.content = content;
    }
​
    public void setContent(String content) {
        this.content = content;
    }
​
    public String getContent() {
        return content;
    }
​
    @Override
    public Prototype clone() {
        return new Document(this.content);
    }
​
    @Override
    public String toString() {
        return "Document [content=" + content + "]";
    }
}
​
// 使用原型模式
public class Main {
    public static void main(String[] args) {
        Document original = new Document("Original Content");
        Document copy = (Document) original.clone();
        copy.setContent("Copied Content");
​
        System.out.println(original);  // 输出: Document [content=Original Content]
        System.out.println(copy);      // 输出: Document [content=Copied Content]
    }
}

#2025(4)

评论