📜  原型设计模式

📅  最后修改于: 2021-09-10 02:47:28             🧑  作者: Mango

原型允许我们向客户端隐藏创建新实例的复杂性。这个概念是复制现有对象而不是从头开始创建新实例,这可能包括昂贵的操作。现有对象充当原型并包含对象的状态。新复制的对象可能仅在需要时更改相同的属性。这种方法节省了昂贵的资源和时间,特别是当对象创建是一个繁重的过程时。

原型模式是一种创造型设计模式。需要原型模式,当对象创建耗时,操作成本高时,我们用现有对象本身创建对象。从现有对象创建对象的最佳可用方法之一是clone() 方法。克隆是实现原型模式的最简单方法。但是,由您决定如何根据您的业务模型复制现有对象。

原型设计参与者

1)原型:这是实际对象的原型。

2)原型注册表:这用作注册表服务,以便使用简单的字符串参数访问所有原型。

3)客户端:客户端将负责使用注册服务访问原型实例。

何时使用原型设计模式

当系统应该独立于其产品的创建、组合和表示方式以及
在运行时指定要实例化的类时。
例如,
1) 通过动态加载或避免构建与产品类层次结构平行的工厂类层次结构或

2) 当一个类的实例可以具有仅有的几种不同状态组合中的一种时。安装相应数量的原型并克隆它们可能更方便,而不是每次都使用适当的状态手动实例化类。

原型设计模式的 UML 图

// A Java program to demonstrate working of
// Prototype Design Pattern with example 
// of a ColorStore class to store existing objects.
  
import java.util.HashMap;
import java.util.Map;
  
  
abstract class Color implements Cloneable
{
      
    protected String colorName;
       
    abstract void addColor();
       
    public Object clone()
    {
        Object clone = null;
        try 
        {
            clone = super.clone();
        } 
        catch (CloneNotSupportedException e) 
        {
            e.printStackTrace();
        }
        return clone;
    }
}
  
class blueColor extends Color
{
    public blueColor() 
    {
        this.colorName = "blue";
    }
   
    @Override
    void addColor() 
    {
        System.out.println("Blue color added");
    }
      
}
  
class blackColor extends Color{
   
    public blackColor()
    {
        this.colorName = "black";
    }
   
    @Override
    void addColor() 
    {
        System.out.println("Black color added");
    }
}
   
class ColorStore {
   
    private static Map colorMap = new HashMap(); 
       
    static 
    {
        colorMap.put("blue", new blueColor());
        colorMap.put("black", new blackColor());
    }
       
    public static Color getColor(String colorName)
    {
        return (Color) colorMap.get(colorName).clone();
    }
}
  
  
// Driver class
class Prototype
{
    public static void main (String[] args)
    {
        ColorStore.getColor("blue").addColor();
        ColorStore.getColor("black").addColor();
        ColorStore.getColor("black").addColor();
        ColorStore.getColor("blue").addColor();
    }
}

输出 :

Blue color added
Black color added
Black color added
Blue color added

例子的UML图:

原型设计模式的优点

  • 在运行时添加和删除产品——原型让您只需向客户端注册一个原型实例,就可以将新的具体产品类合并到系统中。这比其他创建模式更灵活,因为客户端可以在运行时安装和删除原型。
  • 通过改变值指定新对象 –高度动态系统允许您通过指定对象变量的值而不是通过定义新类来通过对象组合来定义新行为。
  • 通过改变结构指定新对象——许多应用程序从部件和子部件构建对象。为方便起见,此类应用程序通常允许您实例化复杂的、用户定义的结构,以一次又一次地使用特定的子电路。
  • 减少子类化——工厂方法通常会生成一个与产品类层次结构平行的 Creator 类层次结构。 Prototype 模式允许您克隆一个原型,而不是要求工厂方法来创建一个新对象。因此,您根本不需要 Creator 类层次结构。

原型设计模式的缺点

  • 对于使用非常少的对象和/或根本不强调原型链扩展的项目,过度杀伤。
  • 它还对客户隐藏了具体的产品类别
  • Prototype 的每个子类都必须实现 clone() 操作,当考虑的类已经存在时,这可能很困难。当其内部包含不支持复制或具有循环引用的对象时,实现 clone() 也可能很困难。