Date: 2019-05-22
Author: Sun
设计模式
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
常见的面向对象的语言中都会有23种设计模式, 每种设计模式实际解决了一类生活中的问题。
本节主要讲解的是单例模式,代理模式,工厂模式。
1 单例模式
举个单例模式例子,我们日常使用的电脑上都有一个任务管理器和回收站,在整个操作系统中,任务管理器和回收站只能有一个实例,整个系统都使用这个唯一的实例,而且自行提供自己的实例。
创建单例--保证只有一个对象
# 实例化一个单例
class Singleton(object):
__instance = None
def __new__(cls, age, name):
#如果类数字能够__instance没有或者没有赋值
#那么就创建一个对象,并且赋值为这个对象的引用,保证下次调用这个方法时
#能够知道之前已经创建过对象了,这样就保证了只有1个对象
if not cls.__instance:
cls.__instance = object.__new__(cls)
return cls.__instance
a = Singleton(28, "runfa")
b = Singleton(38, "xiaoming")
print(id(a))
print(id(b)) #a和b的对象地址都指向同一个。
a.age = 19 #给a指向的对象添加一个属性
print(b.age)#获取b指向的对象的age属性
说明:
被上述单例模式类继承的子类也是单例类
2. 工厂模式
工厂模式是一个在软件开发中用来创建对象的设计模式。
工厂模式包涵一个超类。这个超类提供一个抽象化的接口来创建一个特定类型的对象,而不是决定哪个对象可以被创建。为了实现此方法,需要创建一个工厂类创建并返回。
案例分析:
我们有一个基类Person ,包涵获取名字,性别的方法 。有两个子类male 和female,可以打招呼。还有一个工厂类。
在程序运行期间,用户传递性别给工厂,工厂创建一个与性别有关的对象。因此工厂类在运行期,决定了哪个对象应该被创建。
# -*- coding: utf-8 -*-
__author__ = 'sun'
__date__ = '2019/5/28 16:23'
class Person:
def __init__(self):
self.name = None
self.gender = None
def getName(self):
return self.name
def getGender(self):
return self.gender
class MalePerson(Person):
def __init__(self, name):
print("Hello xiaoming." + name)
class FemalePerson(Person):
def __init__(self, name):
print("Hello baby." + name)
class PersonFactory:
def getPerson(self, name, gender):
if gender == 'M':
return MalePerson(name)
elif gender == 'F':
return FemalePerson(name)
if __name__ == '__main__':
factory = PersonFactory()
person = factory.getPerson("qiangdong", "M")
采用工厂模式,能够使得创建类实例更加的灵活
说明:
关于采用python的23种设计模式的内容敬请关注后续课程。