深入浅出Java设计模式:创建型模式

深入浅出Java设计模式:创建型模式

一、引言

设计模式是软件开发中的最佳实践,它提供了一套经过验证的解决方案,用于解决常见的设计问题。创建型模式,顾名思义,关注对象的创建过程,帮助我们以更加灵活、可扩展的方式创建对象,提高代码的可维护性和可复用性。

二、创建型模式分类

Java中常用的创建型模式主要包括:

  • 抽象工厂模式 (Abstract Factory)
  • 建造者模式 (Builder)
  • 工厂方法模式 (Factory Method)
  • 原型模式 (Prototype)
  • 单例模式 (Singleton)

三、详细介绍

1. 抽象工厂模式 (Abstract Factory)

定义: 提供一个接口用于创建相关或依赖对象的家族,而无需指定具体类。

应用场景: 当需要创建一组相关或依赖的对象,并且需要根据不同的配置或需求创建不同的对象族时。

示例:

假设我们要设计一个汽车制造系统,包含不同品牌和类型的汽车。

interface Car {
  void drive();
}

class BenzCar implements Car {
  @Override
  public void drive() {
    System.out.println("奔驰汽车行驶中...");
  }
}

class BmwCar implements Car {
  @Override
  public void drive() {
    System.out.println("宝马汽车行驶中...");
  }
}

interface CarFactory {
  Car createCar();
}

class BenzCarFactory implements CarFactory {
  @Override
  public Car createCar() {
    return new BenzCar();
  }
}

class BmwCarFactory implements CarFactory {
  @Override
  public Car createCar() {
    return new BmwCar();
  }
}

public class AbstractFactoryDemo {
  public static void main(String[] args) {
    CarFactory benzFactory = new BenzCarFactory();
    Car benzCar = benzFactory.createCar();
    benzCar.drive(); // 输出 "奔驰汽车行驶中..."

    CarFactory bmwFactory = new BmwCarFactory();
    Car bmwCar = bmwFactory.createCar();
    bmwCar.drive(); // 输出 "宝马汽车行驶中..."
  }
}

2. 建造者模式 (Builder)

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

应用场景: 当一个对象的构建过程较为复杂,需要多个步骤才能完成时。

示例:

假设我们要构建一个房屋,它包含多种组件,如墙壁、屋顶、窗户等。

interface HouseBuilder {
  void buildWall();
  void buildRoof();
  void buildWindow();
  House getHouse();
}

class ConcreteHouseBuilder implements HouseBuilder {
  private House house = new House();

  @Override
  public void buildWall() {
    house.setWall("砖墙");
  }

  @Override
  public void buildRoof() {
    house.setRoof("瓦片屋顶");
  }

  @Override
  public void buildWindow() {
    house.setWindow("玻璃窗");
  }

  @Override
  public House getHouse() {
    return house;
  }
}

class House {
  private String wall;
  private String roof;
  private String window;

  public void setWall(String wall) {
    this.wall = wall;
  }

  public void setRoof(String roof) {
    this.roof = roof;
  }

  public void setWindow(String window) {
    this.window = window;
  }

  @Override
  public String toString() {
    return "房屋{" +
        "墙壁='" + wall + '\'' +
        ", 屋顶='" + roof + '\'' +
        ", 窗户='" + window + '\'' +
        '}';
  }
}

public class BuilderDemo {
  public static void main(String[] args) {
    HouseBuilder builder = new ConcreteHouseBuilder();
    builder.buildWall();
    builder.buildRoof();
    builder.buildWindow();
    House house = builder.getHouse();
    System.out.println(house); // 输出 "房屋{墙壁='砖墙', 屋顶='瓦片屋顶', 窗户='玻璃窗'}"
  }
}

3. 工厂方法模式 (Factory Method)

定义: 定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。

应用场景: 当需要创建多个不同类型的对象,但创建过程类似时。

示例:

假设我们要设计一个动物园,包含多种动物,如猫、狗、鸟等。

interface Animal {
  void speak();
}

class Cat implements Animal {
  @Override
  public void speak() {
    System.out.println("喵喵喵");
  }
}

class Dog implements Animal {
  @Override
  public void speak() {
    System.out.println("汪汪汪");
  }
}

interface AnimalFactory {
  Animal createAnimal();
}

class CatFactory implements AnimalFactory {
  @Override
  public Animal createAnimal() {
    return new Cat();
  }
}

class DogFactory implements AnimalFactory {
  @Override
  public Animal createAnimal() {
    return new Dog();
  }
}

public class FactoryMethodDemo {
  public static void main(String[] args) {
    AnimalFactory catFactory = new CatFactory();
    Animal cat = catFactory.createAnimal();
    cat.speak(); // 输出 "喵喵喵"

    AnimalFactory dogFactory = new DogFactory();
    Animal dog = dogFactory.createAnimal();
    dog.speak(); // 输出 "汪汪汪"
  }
}

4. 原型模式 (Prototype)

定义: 使用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。

应用场景: 当需要创建的对象类型是可预知的,并且创建过程比较复杂时。

示例:

假设我们要设计一个文档复制功能,可以复制各种类型的文档。

interface Document {
  Document clone();
}

class TextDocument implements Document {
  private String content;

  public TextDocument(String content) {
    this.content = content;
  }

  @Override
  public TextDocument clone() {
    return new TextDocument(content);
  }

  @Override
  public String toString() {
    return "TextDocument{" +
        "content='" + content + '\'' +
        '}';
  }
}

class ImageDocument implements Document {
  private String imagePath;

  public ImageDocument(String imagePath) {
    this.imagePath = imagePath;
  }

  @Override
  public ImageDocument clone() {
    return new ImageDocument(imagePath);
  }

  @Override
  public String toString() {
    return "ImageDocument{" +
        "imagePath='" + imagePath + '\'' +
        '}';
  }
}

public class PrototypeDemo {
  public static void main(String[] args) {
    Document textDocument = new TextDocument("这是一段文本");
    Document clonedTextDocument = textDocument.clone();
    System.out.println(clonedTextDocument); // 输出 "TextDocument{content='这是一段文本'}"

    Document imageDocument = new ImageDocument("image.jpg");
    Document clonedImageDocument = imageDocument.clone();
    System.out.println(clonedImageDocument); // 输出 "ImageDocument{imagePath='image.jpg'}"
  }
}

5. 单例模式 (Singleton)

定义: 保证一个类仅有一个实例,并提供一个访问该实例的全局访问点。

应用场景: 当需要控制一个类的实例个数,并提供全局访问点时。

示例:

假设我们要设计一个数据库连接池,只能有一个实例。

public class DatabaseConnectionPool {
  private static DatabaseConnectionPool instance;

  private DatabaseConnectionPool() {
  }

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

  public void getConnection() {
    System.out.println("获取数据库连接...");
  }
}

public class SingletonDemo {
  public static void main(String[] args) {
    DatabaseConnectionPool pool1 = DatabaseConnectionPool.getInstance();
    DatabaseConnectionPool pool2 = DatabaseConnectionPool.getInstance();

    System.out.println(pool1 == pool2); // 输出 "true"
    pool1.getConnection();
  }
}

四、总结

创建型模式在Java开发中扮演着重要的角色,它们帮助我们以更加灵活、可扩展的方式创建对象,提升代码质量。选择合适的创建型模式可以有效地解决不同场景下的对象创建问题,并提高代码的可维护性和可复用性。

五、学习建议

  • 阅读相关书籍和文档,深入理解设计模式的定义、应用场景和优缺点。
  • 尝试使用设计模式解决实际问题,并分析不同模式的适用性。
  • 关注代码质量和可维护性,并不断学习和改进设计模式的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斯陀含

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值