【Java 设计模式】创建型之原型模式

发布时间:2024年01月18日

在软件开发中,原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需知道其具体实现。原型模式通常包含一个原型接口和多个实现了该接口的具体原型类。在本文中,我们将介绍 Java 设计模式中的原型模式,了解其定义、使用场景以及如何在实际开发中应用。

1. 定义

原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需知道其具体实现。在原型模式中,一个原型接口定义了一个克隆方法,而具体原型类实现了该克隆方法,从而允许通过复制现有对象的方法来创建新对象。

2. 应用场景

原型模式的应用场景包括但不限于以下情况:

  • 对象创建成本高昂:

    当对象的创建成本较高,而且新对象的创建过程与已有对象相似时,使用原型模式可以通过复制现有对象来降低创建成本

  • 避免构造器执行:

    当对象的构造器执行代价较高,但新对象的创建过程可以通过复制现有对象完成时,使用原型模式可以避免执行构造器

  • 隐藏具体实现:

    客户端不需要知道对象的具体实现类,只需要知道原型接口即可。这有助于降低客户端与具体类之间的耦合

3. 代码实现

原型模式的实现主要涉及以下两个角色:

在这里插入图片描述

  • 原型接口(Prototype): 定义了克隆方法的接口
  • 具体原型类(ConcretePrototype): 实现了原型接口的具体类,负责实现克隆方法

下面是一个简单的原型模式的实现示例:

1)原型接口 Prototype

Prototype.java

package com.cheney.demo;

interface Prototype {
    Prototype clone();
}

2)具体原型类 ConcretePrototype

ConcretePrototype.java

package com.cheney.demo;

class ConcretePrototype implements Prototype {
    private String context;

    public ConcretePrototype(String context) {
        this.context = context;
    }

    @Override
    public Prototype clone() {
        return new ConcretePrototype(this.context);
    }

    public String getContext() {
        return context;
    }

    public void setData(String data) {
        this.context = data;
    }
}

在上述示例中,Prototype 是原型接口,定义了克隆方法。ConcretePrototype 是具体原型类,实现了原型接口的克隆方法。

4. 应用示例

假设我们创建了一个经典的汉堡包,然后需要特殊人的口味复制它,再加入特殊配料。我们可以使用原型模式来创建图形对象的副本。

1)原型接口 Prototype

Prototype.java

package com.cheney.demo;

interface Prototype {
    Prototype clone();
}

2)汉堡包原型接口 HamburgerPrototype

HamburgerPrototype.java

package com.cheney.demo;

interface HamburgerPrototype extends Prototype {
    HamburgerPrototype clone();
    void addIngredient(String ingredient);
    void displayIngredients();
}

3)基础汉堡包原型 CheeseHamburgerPrototype

CheeseHamburgerPrototype.java

package com.cheney.demo;

import java.util.ArrayList;
import java.util.List;

class CheeseHamburgerPrototype implements HamburgerPrototype {
    private final String name;
    private final List<String> ingredients;

    public CheeseHamburgerPrototype(String name) {
        this.name = name;
        this.ingredients = new ArrayList<>();
    }

    private CheeseHamburgerPrototype(CheeseHamburgerPrototype source) {
        this.name = source.name;
        this.ingredients = new ArrayList<>(source.ingredients);
    }

    @Override
    public HamburgerPrototype clone() {
        return new CheeseHamburgerPrototype(this);
    }

    @Override
    public void addIngredient(String ingredient) {
        this.ingredients.add(ingredient);
    }

    @Override
    public void displayIngredients() {
        System.out.println("汉堡包名字: " + name);
        System.out.println("配料: " + String.join(", ", ingredients));
    }
}

在上述示例中,HamburgerPrototype 是图形接口,继承了原型接口 Prototype,定义了克隆方法,和配料的添加及打印。CheeseHamburgerPrototype 是经典汉堡包类,实现了汉堡包制作接口的克隆方法和配料的添加及打印方法。

4)制作汉堡包

package com.cheney.demo;

public class Main {
    public static void main(String[] args) {
        // 创建汉堡包原型对象
        HamburgerPrototype originalHamburger = new CheeseHamburgerPrototype("经典汉堡包");

        // 添加汉堡包原型的配料
        originalHamburger.addIngredient("牛肉饼");
        originalHamburger.addIngredient("芝士");
        originalHamburger.addIngredient("西红柿片");

        // 克隆汉堡包
        HamburgerPrototype clonedHamburger = originalHamburger.clone();

        // 添加克隆对象的配料
        clonedHamburger.addIngredient("番茄酱");

        // 显示原型和克隆对象的配料
        originalHamburger.displayIngredients();
        System.out.println(">>>>>>>>>>>>>>>> 克隆后的:>>>>>>>>>>>>>>>>");
        clonedHamburger.displayIngredients();
    }
}

执行结果

在这里插入图片描述

在上述示例中,我们创建了一个具体原型对象 originalHamburger,然后通过调用 clone 方法来克隆对象,得到一个新的对象 clonedHamburger。最后,我们分别调用原型和克隆对象的 displayIngredients 方法来打印配料。

结语

原型模式是一种灵活且实用的设计模式,通过合理使用,可以提高系统的扩展性和性能。在实际开发中,可以根据需求选择适当的原型模式实现,确保系统具有良好的可维护性和可扩展性。

文章来源:https://blog.csdn.net/yanyc0411/article/details/135660025
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。