软件工程之开发原型设计模式

原型使我们能够从客户端隐藏制作新实例的复杂性。其概念是复制现有对象,而不是从头开始创建新实例,这可能包括昂贵的操作。现有对象充当原型,并包含对象的状态。仅在需要时,新复制的对象才能更改相同的属性。这种方法节省了昂贵的资源和时间,尤其是在对象创建很繁重的过程中。
 
原型模式是一种创新的设计模式。当创建对象非常耗时且操作昂贵时,需要使用原型模式,因此我们使用现有对象本身来创建对象。从现有对象创建对象的最佳可用方法之一是clone()方法。克隆是实现原型模式的最简单方法。但是,您可以根据自己的业务模型来决定如何复制现有对象。

 
原型设计参与者
 
1)原型:这是实际对象的原型。
 
2)原型注册表:用作注册表服务,可使用简单的字符串参数访问所有原型。
 
3)客户:客户将负责使用注册表服务访问原型实例。
 
何时使用原型设计模式
 
一个系统何时应该独立于其产品的创建,组成和表示方式,以及
在运行时指定要实例化的类的时间。
例如,
1)通过动态加载或避免建立与产品的类层次结构平行的工厂的类层次结构,或
 
2)当一个类的实例只能具有几种不同的状态组合之一时。安装相应数量的原型并克隆它们,而不是每次都以适当的状态手动实例化类,可能会更方便。
 
原型设计模式的UML图
 
 
 
filter_none
 
play_arrow
 
brightness_4
// 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<String, Color> colorMap = new HashMap<String, Color>();  
       
    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(); 
    } 
输出:
 
添加蓝色
添加黑色
添加黑色
添加蓝色
UML图示例:
 
 
原型设计模式的优势
 
在运行时添加和删除产品– 原型使您只需向客户端注册原型实例,即可将新的具体产品类合并到系统中。这比其他创建模式要灵活一些,因为客户端可以在运行时安装和删除原型。
通过改变值来指定新对象–高度动态的系统允许您通过为对象的变量指定值而不是通过定义新的类来通过对象组成来定义新的行为。
通过改变结构来指定新对象–许多应用程序从零件和子零件中构建对象。为了方便起见,此类应用程序通常允许您实例化复杂的用户定义结构,以一次又一次地使用特定的子电路。
减少子类化– Factory Method通常会生成与产品类层次结构平行的Creator类层次结构。通过原型模式,您可以克隆原型,而无需要求工厂方法来制作新对象。因此,您根本不需要Creator类的层次结构。
原型设计模式的缺点
 
对于仅使用很少对象和/或根本不强调原型链扩展的项目而言,杀伤力很大。
它还向客户隐藏了具体的产品类别
当所考虑的类已经存在时,Prototype的每个子类都必须实现clone()操作,这可能很困难。当其内部包含不支持复制或具有循环引用的对象时,也很难实现clone()。
 
 
18215660330
179001057@qq.com