案例分析:设计模式与代码的结构特性
Posted sephiroth-w
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了案例分析:设计模式与代码的结构特性相关的知识,希望对你有一定的参考价值。
设计模式 – 工厂模式
一、什么是工厂模式
工厂模式是指定义一个工厂类接口,让工厂子类来创建一系列相关或相互依赖的对象。
工厂模式包涵一个超类。这个超类提供一个抽象化的接口来创建一个特定类型的对象,而不是决定哪个对象可以被创建。
为了实现此方法,需要创建一个工厂类创建并返回。
当程序运行输入一个“类型”的时候,需要创建于此相应的对象。这就用到了工厂模式。在如此情形中,实现代码基于工厂模式,可以达到可扩展,可维护的代码。当增加一个新的类型,不在需要修改已存在的类,只增加能够产生新类型的子类。
工厂模式分为三种:
1.简单工厂模式,只适合简单的情况。
2.工厂方法模式,把简单的工厂模式抽象化了,适合更加复杂的程序设计。
3.抽象工厂模式,工厂类中只写一个抽象方法,让其他类继承并重写该方法。
二、为什么使用工厂模式
(1) 解耦 :把对象的创建和使用的过程分开。
(2) 降低代码重复: 如果创建某个对象的过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。
(3) 降低维护成本 :由于创建过程都由工厂统一管理,所以发生业务逻辑变化,不需要找到所有需要创建对象B的地方去逐个修正,只需要在工厂里修改即可,降低维护成本。
三、工厂模式优缺点
优点:1.工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节;2.够让工厂自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部;3.在系统中加入新产品时,完全符合开闭原则。
缺点:1.系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,会给系统带来一些额外的开销;2.增加了系统的抽象性和理解难度;3.难以支持新种类的产品。
四、案例分析
我们以手机工厂抽象实例作为分析对象,类图如下:
定义抽象工厂类,该抽象类有三个抽象函数,分别为make_shell,make_cpu,make_os。
1 # ------抽象工厂------ 2 class PhoneFactory(metaclass=ABCMeta): 3 @abstractmethod 4 def make_shell(self): 5 pass 6 7 @abstractmethod 8 def make_cpu(self): 9 pass 10 11 @abstractmethod 12 def make_os(self): 13 pass
定义具体工厂类,我们定义了三个工厂,分别为小米工厂,华为工厂和苹果工厂,对应不同的产品线。
1 # ------具体工厂------ 2 class MiFactory(PhoneFactory): 3 def make_shell(self): 4 return BigShell() 5 6 def make_os(self): 7 return Andriod() 8 9 def make_cpu(self): 10 return SnapDragonCPU() 11 12 class HuaweiFactory(PhoneFactory): 13 def make_shell(self): 14 return SmallShell() 15 16 def make_os(self): 17 return Andriod() 18 19 def make_cpu(self): 20 return MediaTekCPU() 21 22 class AppleFactory(PhoneFactory): 23 def make_shell(self): 24 return AppleShell() 25 26 def make_os(self): 27 return ios() 28 29 def make_cpu(self): 30 return AppleCPU()
定义抽象产品类,定义产品的参数。
1 # ------抽象产品------ 2 class PhoneShell(metaclass=ABCMeta): 3 @abstractmethod 4 def show_shell(self): 5 pass 6 7 class CPU(metaclass=ABCMeta): 8 @abstractmethod 9 def show_cpu(self): 10 pass 11 12 class OS(metaclass=ABCMeta): 13 @abstractmethod 14 def show_os(self): 15 pass
定义具体产品类,我们定义了手机壳的大小款式,CPU型号选择及手机系统选择。
1 # ------具体产品------ 2 class SmallShell(PhoneShell): 3 def show_shell(self): 4 print(‘小手机壳‘) 5 6 class BigShell(PhoneShell): 7 def show_shell(self): 8 print(‘大手机壳‘) 9 10 class AppleShell(PhoneShell): 11 def show_shell(self): 12 print(‘苹果机壳‘) 13 14 class SnapDragonCPU(CPU): 15 def show_cpu(self): 16 print(‘骁龙CPU‘) 17 18 class MediaTekCPU(CPU): 19 def show_cpu(self): 20 print(‘联发科CPU‘) 21 22 class AppleCPU(CPU): 23 def show_cpu(self): 24 print(‘苹果CPU‘) 25 26 class Andriod(OS): 27 def show_os(self): 28 print(‘安卓系统‘) 29 30 class IOS(OS): 31 def show_os(self): 32 print(‘iOS系统‘)
定义客户端
1 # ------客户端------ 2 class Phone: 3 def __init__(self,shell,os,cpu): 4 self.shell=shell 5 self.os=os 6 self.cpu=cpu 7 8 def show_info(self): 9 print(‘手机信息‘) 10 self.cpu.show_cpu() 11 self.shell.show_shell() 12 self.os.show_os() 13 14 def make_phone(factory): 15 cpu = factory.make_cpu() 16 os = factory.make_os() 17 shell = factory.make_shell() 18 return Phone(shell,os,cpu)
最后执行时只需要调用我们的make_phone客户端函数
1 phone = make_phone(AppleFactory()) 2 phone.show_info()
以上是关于案例分析:设计模式与代码的结构特性的主要内容,如果未能解决你的问题,请参考以下文章