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

Posted hesetone

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了案例分析:设计模式与代码的结构特性相关的知识,希望对你有一定的参考价值。

  工厂模式属于C++设计模式之一,而且大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象(这里实际上就是通过利用父类指针指向子类对象,使得子类成员函数具体调用哪个类里面的函数,需要等到运行期间动态确定,也就是后面说到的多态)。这里首先介绍简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品。有新的产品加入时,则需要修改一下工厂类。

1、简单工厂模式

 

技术图片

在简单工厂模式下,工厂类Factory是工厂模式的核心类,它会定义一个用于创建指定的具体实例对象的接口HaveFruit。而抽象产品类Fruit是具体产品类的继承的父类或实现的接口。这种特性一般是通过父类定义一个虚函数,作为接口,具体实现部分留给子类自身去实现,具体产品类则是指工厂类所创建的对象,就是此具体产品实例。在这里,工厂类封装了创建具体产品对象的函数。扩展性非常差,新增产品的时候,需要去修改工厂类,也就是需要修改之前设定好的创建指定的具体实例对象的接口HaveFruit。在简单工厂模式下,Apple、Melon和Banana三个子类分别按照各自的要求实现父类中的虚函数,而在Factory类中,有创建对象的接口,虽然里面只有一个接口,只要我们指定对象类型,就会利用同一个接口得到不同的对象,这就是运行期间的多态,父类指针指向子类对象,根据子类对象的类型,调用不用的函数,而不是调用父类函数,

2、工厂方法模式

技术图片

工厂方法模式中,一共包含抽象工厂类、具体工厂类、抽象产品类和具体产品类四个模块,其中,抽象工厂类是工厂方法模式中的核心类,它提供创建具体产品的接口,由具体工厂类实现。具体工厂类继承于抽象工厂,实现创建对应具体产品对象的方式。抽象产品类是具体产品继承的父类(基类)。具体产品类:具体工厂所创建的对象,就是子类。在工厂方法模式中,工厂方法模式抽象出了工厂类,提供创建具体产品的接口,交由子类去实现。而且,工厂方法模式的应用并不只是为了封装具体产品对象的创建,而是要把具体产品对象的创建放到具体工厂类实现。但是,工厂方法模式也是存在缺陷的,每新增一个产品,依然是需要增加一个对应的产品的具体工厂类。而且相比简单工厂模式而言,工厂方法模式它需要更多的类定义,也就是子类需要抽象类中的接口,此外,一条生产线只能一个产品。不同于简单工厂模式的是,这里的对象实例化接口放到了具体的对象工厂中,比如说,HaveFruit接口不再是存在于Factory类中,而是存在于AppleFactory具体工厂类中。

 

3、抽象工厂模式

 

技术图片

 

在抽象工厂模式中,抽象工厂类依然是工厂方法模式的核心类,它提供创建具体产品的接口,由具体工厂类实现。具体工厂类:继承于抽象工厂,实现创建对应具体产品对象的方法。抽象产品类:它是具体产品继承的父类(基类)。具体产品类:具体工厂所创建的对象,就是此类。抽象工厂模式提供一个接口,可以创建多个产品族中的产品对象。比如上面UML图中,水果工厂,则可以创建水果产品、果汁产品等。但是,抽象工厂模式同工厂方法模式一样,新增产品时,都需要增加一个对应的产品的具体工厂类。

4、工厂模式架构的好处与适用性

  在实际应用中,首先,符合现实中的情况,而且客户端免除了直接创建产品对象的责任,但是很可能产品是一个多层次的树状结构。由于简单工厂模式中只有一个工厂类来对应这些产品,所以这可能会给我们的开发流程带来大量不便。正如前面提到的简单工厂模式适用于业务简单的情况下或者具体产品很少增加的情况。而对于复杂的业务环境可能不太适应了。这样设计的主要缺点之前也提到过,就是要增加新的产品类型时,就需要修改工厂类。这就违反了开放封闭原则:软件实体(类、模块、函数)可以扩展,但不可修改。于是,工厂方法模式出现了。所谓工厂方法模式,是指定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

  用开闭原则来分析下工厂方法模式。当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代码。(即当有新产品时,只要创建并基础抽象产品;新建具体工厂继承抽象工厂;而不用修改任何一个类)工厂方法模式是完全符合开闭原则的!使用工厂方法模式足以应付我们可能遇到的大部分业务需求。但是当产品种类非常多时,就会出现大量的与之对应的工厂类,这不应该是我们所希望的。所以我建议在这种情况下使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实现。当然特殊的情况,就要特殊对待了:对于系统中存在不同的产品树,而且产品树上存在产品族。那么这种情况下就可能可以使用抽象工厂模式了。

  首先我们要有Factory这个工厂的父接口,所有的子类或者子接口都可以实现它。CreateFactory则是子类的代表之一,所以利用C++的多态来实现,降低代码的耦合性。而同时每个子工厂中拥有每条生产独特产品的生产线。由此,工厂和产品挂上钩了,联系上了。每个子工厂生产出来的都是独特的产品。保留了封装对象创建过程的优点,降低客户端和工厂的耦合性,所以说“工厂模式”是“简单工厂模式”的进一步抽象和推广。每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。

5、代码示例链接

https://github.com/hesetone/SSE

 

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

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

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

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

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

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

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