原型模式,使用的情景:是想根据现有的对象复制出新的对象并对其修改。
1不用说了,很经典的实例化
2使用了 eval() ,在之前的工厂模式里面是见到了,现在明白了()里面的括号,它就相当于 point1
3,4都是使用了内置函数 getattr 和 globals 来进行创建
5使用 make_object()
6使用copy
以上2-6都是借助了函数来完成
7呢,可以着重来看看,它是对 point1 进行了修改,而就变成了另一个新的对象 point7。效率是能提高。
单例模式,使用情景:整个程序的运行过程中,某个类只应该出现一个实例。
python 中有 Singleton 类和 Brog 类来实现单例模式,但是现在要看的实现方式是:
把全局状态放在私有变量中,并且提供用于访问此变量的公开函数。
这里的举例是:
写一个函数
返回含有货币汇率的字典{货币:汇率}
这个函数会被多次使用
但是汇率数据只需获取一次就够了
这里的举例,是以平面上的点为类,进行原型模式的演示
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
point1 = Point(1, 2)
point2 = eval("{}({},{})".format("Point", 2, 4))
point3 = getattr(sys.modules[__name__], "Point")(2, 5)
point4 = globals()["Point"](3, 4)
point5 = make_object(Point, 10, 20)
point6 = copy.deepcopy(point5)
point6.x = 9
point6.y = 10
point7 = point1.__class__(30, 50)
Point类,可以看到是很基础的一个类,x , y 两个坐标属性
1不用说了,很经典的实例化
2使用了 eval() ,在之前的工厂模式里面是见到了,现在明白了()里面的括号,它就相当于 point1
3,4都是使用了内置函数 getattr 和 globals 来进行创建
5使用 make_object()
6使用copy
以上2-6都是借助了函数来完成
7呢,可以着重来看看,它是对 point1 进行了修改,而就变成了另一个新的对象 point7。效率是能提高。
单例模式,使用情景:整个程序的运行过程中,某个类只应该出现一个实例。
python 中有 Singleton 类和 Brog 类来实现单例模式,但是现在要看的实现方式是:
把全局状态放在私有变量中,并且提供用于访问此变量的公开函数。
这里的举例是:
写一个函数
返回含有货币汇率的字典{货币:汇率}
这个函数会被多次使用
但是汇率数据只需获取一次就够了
# 这是Rate类的一个属性
_URL = "XXXXXXXXXX"
def get(refresh=False):
if refresh:
get.rates = {}
if get.rates:
return get.rates
with urllib.request.urlopen(_URL) as file:
for line in file:
line = line.rstrip().decode("utf-8")
if not line or line.startwith(("#", "Date")):
continue
name, currency, *rest = re.split(r"\s*,\s*", line)
key = "{}({})".format(name, currency)
try:
get.rates[key] = float(rest[-1])
except ValueError as err:
print "error"
return get.rates
get.rates = {}
第一次执行,下载了全部汇率,if get.rates ,有数据了之后就不在执行此类,以后直接使用 rates 这个字典即可
总的来说,原型模式和单例模式都是次的,最有用的是抽象工厂,工厂方法和建造者模式。
下一阶段就到创造好基本的对象之后,该怎么继续呢?