原型模式

81 阅读4分钟

1. 原型模式简介

一句话介绍:原型模式是一种创建型设计模式,它通过复制现有对象来创建新对象,从而避免了使用构造函数创建对象的开销。

2. 原型模式详细介绍

原型模式的核心思想是通过复制现有对象来创建新对象,而不是通过构造函数创建对象。在原型模式中,我们首先创建一个原型对象,然后通过复制原型对象来创建新对象。这种方式不仅避免了使用构造函数创建对象的开销,而且可以避免一些与对象创建相关的问题,例如构造函数参数过多、对象初始化复杂等。

3. 使用场景以及优缺点

使用场景:

  • 当一个对象的创建过程比较复杂或耗时的时候,可以使用原型模式来避免重复的构造过程,提高对象创建的效率;
  • 当需要创建的对象之间存在部分相同或相似的状态时,可以使用原型模式来复制现有对象,然后进行修改,以快速创建新对象。

优点:

  • 可以避免使用构造函数创建对象的开销,提高对象创建的效率;
  • 可以避免一些与对象创建相关的问题,例如构造函数参数过多、对象初始化复杂等。

缺点:

  • 需要对原型对象进行克隆操作,可能会增加系统的复杂度;
  • 需要确保原型对象和克隆对象之间的状态正确复制,否则可能会出现意外的问题。

4. 使用Python实现原型模式

下面是使用Python实现原型模式的简单示例:

import copy

class Prototype:
    def __init__(self):
        self._x = 0
        self._y = 0

    def clone(self):
        # 使用 copy 模块的 deepcopy 方法进行深拷贝
        return copy.deepcopy(self)

    def show(self):
        print(f"x: {self._x}, y: {self._y}")

# 使用示例
prototype = Prototype()
prototype.show()  # 输出: x: 0, y: 0

# 克隆原型对象
clone = prototype.clone()
clone.show()  # 输出: x: 0, y: 0

# 修改克隆对象的状态
clone._x = 10
clone._y = 20
clone.show()  # 输出: x: 10, y: 20

在这个示例中,我们定义了一个名为 Prototype 的原型类,其中包含 _x_y 两个状态。我们使用 clone 方法来复制原型对象,并使用 copy.deepcopy 方法进行深拷贝,以确保原型对象和克隆对象之间的状态正确复制。然后,我们修改克隆对象的状态,验证了原型模式的正确性。

5. 简单练习:【设计模式专题之原型模式】5. 矩形原型

""" 
【设计模式专题之原型模式】5. 矩形原型
时间限制:1.000S  空间限制:256MB
题目描述
公司正在开发一个图形设计软件,其中有一个常用的图形元素是矩形。设计师在工作时可能需要频繁地创建相似的矩形,而这些矩形的基本属性是相同的(颜色、宽度、高度),为了提高设计师的工作效率,请你使用原型模式设计一个矩形对象的原型。使用该原型可以快速克隆生成新的矩形对象。

输入描述
首先输入一个字符串,表示矩形的基本属性信息,包括颜色、长度和宽度,用空格分隔,例如 "Red 10 5"。

然后输入一个整数 N(1 ≤ N ≤ 100),表示使用原型创建的矩形数量。

输出描述
对于每个矩形,输出一行字符串表示矩形的详细信息,如 "Color: Red, Width: 10,Height: 5"。
输入示例
Red 10 5
3
输出示例
Color: Red, Width: 10, Height: 5
Color: Red, Width: 10, Height: 5
Color: Red, Width: 10, Height: 5
提示信息
使用原型模式中的克隆方法实现矩形对象的创建。
"""


from abc import ABC, abstractmethod
from copy import deepcopy


class Shape(ABC):
    @abstractmethod
    def clone(self):
        raise NotImplemented
        
class Rectangle(Shape):
    def __init__(self, color: str, width: int, height: int):
        self.color = color
        self.width = width
        self.height = height
        
    def clone(self) -> Shape:
        return deepcopy(self)
        
    def show(self):
        print("Color: {}, Width: {}, Height: {}".format(
            self.color, self.width, self.height
        ))
        
def client():
    inputs = input().split(" ")
    color, width, height = inputs[0], int(inputs[1]), int(inputs[2])
    proto = Rectangle(color, width, height)
    n = int(input())
    for _ in range(n):
        clone = proto.clone()
        clone.show()
        
if __name__ == "__main__":
    client()