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()