案例分析:设计模式与代码的结构特性

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()

 

以上是关于案例分析:设计模式与代码的结构特性的主要内容,如果未能解决你的问题,请参考以下文章

案例分析:设计模式与代码的结构特性

案例分析:设计模式与代码的结构特性

案例分析:设计模式与代码的结构特性

案例分析:设计模式与代码的结构特性

案例分析:设计模式与代码的结构特性

案例分析:设计模式与代码的结构特性