Python的创建型设计模式之原型模式与单例模式

原型模式,使用的情景:是想根据现有的对象复制出新的对象并对其修改。

这里的举例,是以平面上的点为类,进行原型模式的演示

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 这个字典即可



总的来说,原型模式和单例模式都是次的,最有用的是抽象工厂,工厂方法和建造者模式。
下一阶段就到创造好基本的对象之后,该怎么继续呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值