设计模式应试复习篇(一)——举例说明6种创建型模式的适用情景

系列说明:这个系列是为了设计模式考试做的复习总结,因为感觉书上内容很多很抽象,所以想用自己的语言结合例子希望能说的容易理解些,但是自己理解难免会有偏差的地方,这个系列也更多的是为了应试,所以欢迎纠错啦~~

本篇说明:本篇会用自己的语言说明6种创建型模式的适用场景,能够先对每个模式是做什么的有一个总体的把握

1、简单工厂模式

首先既然叫简单工厂,那么模式中就只有一个工厂。这个工厂可以生产很多东西,比如一个水果工厂里有苹果、香蕉、草莓等等。工厂生产这些水果都有相应的方法,比如生产苹果的方法是种植在小山坡上,三天浇一次水,而生产草莓的方法是种植在大棚里一天浇一次水。我们想要什么水果只需要把水果的名字这个参数告诉工厂,工厂就会调用相应水果的生产方法然后把产出的水果返回给我们。

简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。

2、工厂方法模式(又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式)

可是现在我们还想要工厂生产橙子,这时整个工厂都要做出改变,比如工厂可能需要重新调整各个水果的位置等等,这就违背了设计模式的原则,因为我们希望设计模式能对增加开放,对修改关闭呀!所以工厂方法就闪亮登场,我们有一个工厂,这个工厂定义了生产产品的方法,但是需要特定的子工厂来实现,比如生产苹果的工厂、生产橙子的工厂······当我们还需要什么别的水果时,比如我们又想要哈密瓜了,就让子哈密瓜工厂实现抽象工厂的方法就可以了,不需要修改现有工厂。

工厂方法模式的主要优点是增加新的产品类时无须修改现有系统,并封装了产品对象的创建细节,系统具有良好的灵活性和可扩展性;其缺点在于增加新产品的同时需要增加新的工厂,导致系统类的个数成对增加,在一定程度上增加了系统的复杂性。 

3、抽象工厂模式

现在又有新的问题了,其实每个工厂不应该只生产一种东西呀,比如苹果工厂,除了生产苹果,还生产苹果汁、苹果干,如果用工厂方法模式的话那么工厂的数量可太多了,这就用到抽象工厂模式了,,在工厂方法模式的基础上,我们允许一个工厂生产多个产品。这里引入两个概念:

1)产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。

2)产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。

抽象工厂模式的主要优点是隔离了具体类的生成,使得客户并不需要知道什么被创建,而且每次可以通过具体工厂类创建一个产品族中的多个对象,增加或者替换产品族比较方便,增加新的具体工厂和产品族很方便;主要缺点在于增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。 

4、建造者模式

我们换一个例子来理解建造者模式,前面的水果成熟了采摘下来就是一个完整的产品了,可是对于汽车来说,不但有零件的生产过程,还有零件的组装过程,而且零件的组装过程往往有特定的顺序,这时候就要用到建造者模式了,建造者模式中不但有控制零件生产的类,还有一个指挥者类,这个指挥者可以控制零件的生产顺序。

建造者模式的优点在于客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象,每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,符合“开闭原则”,还可以更加精细地控制产品的创建过程;其缺点在于由于建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,因此其使用范围受到一定的限制,如果产品内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大

5、原型模式

再换一个例子,我们是不是会经常拷贝代码到各种地方,比如博客里,比如Word文档里等等,如果没有拷贝在哪里用到相同的代码都需要重新写的话实在是太累人了,这就是原型模式的作用。

原型模式最大的优点在于可以快速创建很多相同或相似的对象,简化对象的创建过程,还可以保存对象的一些中间状态;其缺点在于需要为每一个类配备一个克隆方法,因此对已有类进行改造比较麻烦,需要修改其源代码,并且在实现深克隆时需要编写较为复杂的代码。

6、单例模式(又名单件模式或单态模式)

这个可以和上面的原型模式联系起来,虽然有的东西我们可以有多个对象,但也有很多情况下我们需要保证一个类只有一个实例,比如每个人一个学期可以有几门课程的分数都是相同的,但是我们只有一个成绩单。

单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。 单例模式有三个要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。

单例模式的主要优点在于提供了对唯一实例的受控访问并可以节约系统资源;其主要缺点在于因为缺少抽象层而难以扩展,且单例类职责过重。

猜你喜欢

转载自blog.csdn.net/qq_40996041/article/details/83547949