设计模式:简单工厂、原型,模板方法模式

1.简单工厂模式(Simple Factory Pattern)

目的: 简单工厂模式是一种创建型设计模式,它提供一个静态方法来决定应该创建哪种类型的对象。这个静态方法可以根据输入参数或其他条件来选择正确的产品类,并返回其实例。简单工厂常被用于集中管理和控制对象的创建过程,将客户端与具体产品类的实例化过程解耦。

结构

  • Factory(简单工厂):包含一个静态方法,此方法基于传入的参数决定创建哪个具体产品类的实例,并返回该实例。
  • Product(产品接口/抽象类):定义了所有产品共有的公共接口,具体产品必须实现这个接口。
  • ConcreteProduct(具体产品):实现了产品接口的具体类,是简单工厂要创建的目标对象。

示例场景: 创建不同种类动物的实例,如狗、猫,有一个 AnimalFactory 类,通过传入字符串类型来决定创建 Dog 或 Cat 对象。

// Product
interface Animal {
    void makeSound();
}

// ConcreteProduct
class Dog implements Animal {
    @Override
    public void makeSound() {
        System.out.println("Woof!");
    }
}

class Cat implements Animal {
    @Override
    public void makeSound() {
        System.out.println("Meow!");
    }
}

// Factory
class AnimalFactory {
    public static Animal createAnimal(String type) {
        if ("dog".equals(type)) {
            return new Dog();
        } else if ("cat".equals(type)) {
            return new Cat();
        } else {
            throw new IllegalArgumentException("Invalid animal type");
        }
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        Animal dog = AnimalFactory.createAnimal("dog");
        dog.makeSound(); // 输出:Woof!
    }
}

2.原型模式(Prototype Pattern)

目的: 原型模式是一种创建型设计模式,它通过拷贝现有的实例来创建新对象,而不是新建对象。这种模式适用于那些初始化成本高或状态变化大的对象,通过复制已存在的实例可以节省创建的时间和资源。

结构

  • Prototype(抽象原型):声明克隆自身的接口。
  • ConcretePrototype(具体原型):实现抽象原型接口,提供复制自身的方法(clone 方法)。
  • Client(客户端):请求创建新对象时,向原型请求克隆。

示例场景: 数据库连接对象,创建连接耗时且消耗资源,因此可以通过原型模式复制已建立好的连接对象,而非每次都新建连接。

// Prototype
interface CloneableAnimal {
    CloneableAnimal clone();
}

// ConcretePrototype
class Dog implements CloneableAnimal {
    @Override
    public CloneableAnimal clone() {
        return new Dog();
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        CloneableAnimal clonedDog = dog.clone();
    }
}

3.模板方法模式(Template Method Pattern)

目的: 模板方法模式是一种行为设计模式,它在一个抽象类中定义一个算法的骨架,允许子类在不改变结构的情况下重写某些步骤。这种方式使框架的设计者可以在抽象类中定义一套算法的固定步骤,而具体实现步骤由子类来提供。

结构

  • AbstractClass(抽象类):定义了算法的骨架,包含了一个或多个基本操作的模板方法(一般是 final 的),以及一些抽象方法供子类实现。
  • ConcreteClass(具体子类):实现抽象类中定义的抽象方法,完成算法中的具体步骤。

示例场景: 咖啡制作流程,抽象类 Coffee 里定义了制作咖啡的基本步骤(磨豆、煮水、冲泡等),而具体的美式咖啡 AmericanCoffee 和拿铁咖啡 LatteCoffee 分别实现了加奶、加糖等特定步骤。

// AbstractClass
abstract class Coffee {
    final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    abstract void brew();

    void boilWater() {
        System.out.println("Boiling water...");
    }

    void pourInCup() {
        System.out.println("Pouring into cup...");
    }

    abstract void addCondiments();
}

// ConcreteClass
class AmericanCoffee extends Coffee {
    @Override
    void brew() {
        System.out.println("Dripping coffee through filter...");
    }

    @Override
    void addCondiments() {
        System.out.println("Adding sugar and milk...");
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        AmericanCoffee coffee = new AmericanCoffee();
        coffee.prepareRecipe();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值