1. 设计模式是什么?有什么用?
设计模式是软件开发过程中经过验证的、用于解决特定环境下、重复出现的、特定问题的解决方案。
根据GoF(Gang Of Four),设计模式被分为三类:
- 创建型模式
-->抽象了对象实例化的过程,用来帮助创建对象的实例。
- 结构型模式
-->描述如何组合类和对象以获得更大的结构。
- 行为型模式
-->描述算法和对象间职责的分配。
在很多面向对象语言的框架中(尤其是Java),到处可以看到运用设计模式的影子。设计模式已经成为软件开发人员的标准词汇,学习设计模式可以避免重复造轮子(毕竟这些模式是高手总结出来的经验,我们学会即可),也是个人技术能力提升的途径。
虽然是模式可以照搬,但最好还是结合场景,活学活用。活学活用建立在对设计模式深入的认知和不断地运用实践,从知到行还是需要一个过程的。
实践是检验掌握知识的唯一标准,本人比较熟悉Python,这里只展示如何使用Python来实现,至于其他语言,可以参考网上其他资料,或者是下面这个网站:设计模式目录。
2. 设计模式的几个基本原则
2.1 单一职责原则
单一职责实质上要求我们要解耦:让一个类只负责一件事情。多个类然后通过组合实现某个具体业务。也是KISS(Keep It Simple)思想的一种体现。
2.2 开闭原则
开闭原则是指导我们对代码进行扩展的原则:一个类应该对扩展开放,对修改关闭。开闭原则需要我们思考出哪些是经常变化的、哪些不是,然后将它们分离开来。
2.3 里氏替换原则
里氏替换实质上是多态:子类型必须能够替换掉它们的父类型。继承是实现扩展的一种实现手段,而里氏替换正是使用继承,只有子类型能够正确替换父类型,才能很好的实现扩展,否则就会出错。
2.4 依赖倒置原则
依赖倒置要求我们要依赖抽象,不要依赖具体类。那这里的抽象是什么呢?一般情况下就是接口。
2.5 接口隔离原则
不应该强迫客户依赖于他们不用的方法。
3. 创建者模式
3.1 简单工厂
3.1.1 定义
提供一个创建对象实例的功能,而无需关心其具体实现。
3.1.2 举例
# encoding=utf8
import enum
class Animal(object):
def speak(self):
raise NotImplemented
class Cat(Animal):
def speak(self):
print("Cat:Meow")
class Dog(Animal):
def speak(self):
print("Dog:Wong")
class AnimalType(enum.Enum):
Type_Dog = 1
Type_Cat = 2
# 使用普通函数
def create_animal(animal_type):
if animal_type == AnimalType.Type_Dog:
return Dog()
elif animal_type == AnimalType.Type_Cat:
return Cat()
# 使用静态方法,好处是如果有多个简单工厂方法,可以作为一个类对外提供功能
class Factory(object):
@staticmethod
def create_animal(animal_type):
if animal_type == AnimalType.Type_Dog:
return Dog()
elif animal_type == AnimalType.Type_Cat:
return Cat()
if __name__ == '__main__':
animal = create_animal(AnimalType.Type_Dog)
animal.speak()
animal = Factory.create_animal(AnimalType.Type_Cat)
animal.speak()
3.1.3 解释
在简单工厂中,接口、实现类和工厂方法组成了一个整体,在这个整体中,只有简单工厂方法和接口是对外的,具体的实现类不对外,被包含在简单工厂方法中。
3.2 工厂方法
3.2.1 定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类 。
3.2.2 举例
# encoding=utf8
class PhoneFactory(object):
def create_factory(self):
raise NotImplemented
def render(self):
phone = self.create_factory()
phone.render()
class AndroidFactory(PhoneFactory):
def create_factory(self):
return Android()
class IPhoneFactory(PhoneFactory):
def create_factory(self):
return IPhone()
class Phone(object):
def render(self):
raise NotImplemented
class Android(Phone):
def render(self):
print("Android render")
class IPhone(Phone):
def render(self):
print("IPhone render")
if __name__ == '__main__':
android = AndroidFactory()
android.render()
iphone = IPhoneFactory()
iphone.render()
3.2.3 解释
工厂方法的主要功能是让父类不知道具体实现的情况下,完成自身的功能调用,而具体的实现延迟到子类来实现。
在工厂方法模式中,一般是Creator(比如例子中的PhoneFactory)的其他方法在使用工厂方法创建的对象。
工厂方法的本质是延迟到子类来选择实现。
标签:常用,render,Python,self,animal,设计模式,class,def From: https://www.cnblogs.com/bfstudy/p/16617458.html