设计模式之-创建型
GOF的23种设计模设可以分为三大类,创建型,结构型,行为型.
定义所谓创建型模式,就是处理类或者对象创建的设计模式,试图根据实际情况使用合适的方式创建类和对象。基本的类和对象的创建方式可能会导致设计和维护上的问题,或增加了设计的复杂度。创建型模式通过以某种方式控制对象的创建来解决这些问题。
思想创建型模式由两个主导思想构成。
一是针对类的创建,就是将系统使用的具体类封装起来,
二是针对对象的实例化,就是隐藏这些具体类的实例创建和结合的方式
种类GoF23种设计模式中创建型模式有5种,
设计模式
GoF的描述
我的理解
Singleton单例模式
保证一个类仅有一个实例,并提供一个该实例全局的访问点
同一时刻只能被一个线程访问情况
Abstract Factory抽象工厂模式
提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定他们的具体类
提供一个接口,用来产生多个相关的不同对象
Builder建造者模式
将一个复杂对象的构建与其表示向分离,使得同样的构建过程可以创建不同的表示
用于复杂对象的构建;这个对象的组成部分可能是
经常变化的,该对象是通过一定的算法由子对象构建
Factory Method工厂方法模式
定义一个用于创建对象的接口,让子类决定实例化那个类。FactoryMethod使得一个类的实例化延迟到子类
根据提供的数据或者参数,返回一个抽象类的
一个子类对象
Prototype原型模式
使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象
大量相同或者相似对象的创建
UML图展示1.抽象工厂模式
2.建造者模式
3.工厂方法模式
4.原型模式
5.单例模式
使用现在软件设计更加依赖对象的组合,而不是类的继承,强调从硬编码的行为转变到定义一组基本行为来组合成复杂的行为。硬编码的行为不够灵活,因为如果想要改变设计的一部分,需要通过重写或者重新实现才能完成。另外,硬编码没有提高重用性,而且难以跟踪错误。由于这些原因,创建型模式比硬编码的行为更有用。创建型模式使设计变得更灵活,提供了不同的方式,从代码中移除了对需要实例化的具体类的引用。也就是说这些模式增强了对象和类之间的独立性。
下面的情况可以考虑应用创建型模式:
一个系统需要和它的对象和产品的创建相互独立。
一组相关的对象被设计为一起使用。
隐藏一个类库的具体实现,仅暴露它们的接口。
创建独立复杂对象的不同表示。
一个类希望它的子类实现它所创建的对象。
类的实例化在运行时才指定。
一个类只能有一个实例,而且这个实例能在任何时候访问到。
实例应该能在不修改的情况下具有可扩展性。
对比简单工厂、工厂方法、抽象工厂比较
简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。
※简单工厂:简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。不修改代码的话,是无法扩展的。
※工厂方法:工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品。
※抽象工厂:抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。
工厂模式中,重要的是工厂类,而不是产品类。产品类可以是多种形式,多层继承或者是单个类都是可以的。但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。
区别:
简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂模式 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂:用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
抽象工厂模式和建造者模式比较
抽象工厂模式是应对一系列对象的创建的问题,,抽象工厂模式更关注一系列的对象的创建
建造者模式是应对一个复杂对象创建的问题,或者说是针对这个复杂对象中的子对象的创建的问题。