设计模式之创建型

                    设计模式之-创建型

                         GOF的23种设计模设可以分为三大类,创建型,结构型,行为型.

定义

       所谓创建型模式,就是处理类或者对象创建的设计模式,试图根据实际情况使用合适的方式创建类和对象。基本的类和对象的创建方式可能会导致设计和维护上的问题,或增加了设计的复杂度。创建型模式通过以某种方式控制对象的创建来解决这些问题。

思想

       创建型模式由两个主导思想构成。

一是针对类的创建,就是将系统使用的具体类封装起来,

二是针对对象的实例化,就是隐藏这些具体类的实例创建和结合的方式

种类

       GoF23种设计模式中创建型模式有5种,

设计模式

GoF的描述

我的理解

Singleton单例模式

保证一个类仅有一个实例,并提供一个该实例全局的访问点

同一时刻只能被一个线程访问情况

Abstract Factory抽象工厂模式

提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定他们的具体类

提供一个接口,用来产生多个相关的不同对象

Builder建造者模式

将一个复杂对象的构建与其表示向分离,使得同样的构建过程可以创建不同的表示

用于复杂对象的构建;这个对象的组成部分可能是

经常变化的,该对象是通过一定的算法由子对象构建

Factory Method工厂方法模式

定义一个用于创建对象的接口,让子类决定实例化那个类。FactoryMethod使得一个类的实例化延迟到子类

 根据提供的数据或者参数,返回一个抽象类的

一个子类对象

Prototype原型模式

使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象

大量相同或者相似对象的创建

UML图展示

1.抽象工厂模式

2.建造者模式

3.工厂方法模式

4.原型模式

5.单例模式

使用

       现在软件设计更加依赖对象的组合,而不是类的继承,强调从硬编码的行为转变到定义一组基本行为来组合成复杂的行为。硬编码的行为不够灵活,因为如果想要改变设计的一部分,需要通过重写或者重新实现才能完成。另外,硬编码没有提高重用性,而且难以跟踪错误。由于这些原因,创建型模式比硬编码的行为更有用。创建型模式使设计变得更灵活,提供了不同的方式,从代码中移除了对需要实例化的具体类的引用。也就是说这些模式增强了对象和类之间的独立性。

下面的情况可以考虑应用创建型模式:

一个系统需要和它的对象和产品的创建相互独立。

一组相关的对象被设计为一起使用。

隐藏一个类库的具体实现,仅暴露它们的接口。

创建独立复杂对象的不同表示。

一个类希望它的子类实现它所创建的对象。

类的实例化在运行时才指定。

一个类只能有一个实例,而且这个实例能在任何时候访问到。

实例应该能在不修改的情况下具有可扩展性。

对比

简单工厂、工厂方法、抽象工厂比较

简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。

 

※简单工厂:简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。不修改代码的话,是无法扩展的。

 

※工厂方法:工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品。

 

※抽象工厂:抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。

     工厂模式中,重要的是工厂类,而不是产品类。产品类可以是多种形式,多层继承或者是单个类都是可以的。但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。

区别:

简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)

工厂模式 :用来生产同一等级结构中的固定产品。(支持增加任意产品)

抽象工厂:用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

 

抽象工厂模式和建造者模式比较

        抽象工厂模式是应对一系列对象的创建的问题,,抽象工厂模式更关注一系列的对象的创建

        建造者模式是应对一个复杂对象创建的问题,或者说是针对这个复杂对象中的子对象的创建的问题。

 

原文地址:https://www.cnblogs.com/xinyuyuanm/p/3014182.html