设计模式详解--创建型

创建型

  • 共5种
  • 工厂方法模式、抽象工厂模式、建造者模式、单例模式、原型模式

简单工厂模式

  • 概念

    又称为静态工厂方法模式,在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂不属于GOF设计模式

  • 优点

    客户端可以免除直接创建产品对象的责任,而仅仅是“消费”产品

  • 缺点

    不符合开闭原则,系统扩展困难

  • 使用场景 ★★★★☆

    • 工厂类负责创建的对象比较少。由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂
    • 客户端只知道传入工厂类的参数,对于如何创建对象不关心,更不关心创建的细节


      简单工厂.png

创建型

工厂方法模式

  • 概念

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类

  • 优点

    • 工厂方法用来创建客户所需的产品,向客户隐藏了那个具体产品类将被实例化这一细节。用户只需关心产品对应的工厂,无需关心创建细节
    • 它能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部
    • 符合开闭原则,新增产品时,无需修改抽象工厂和抽象产品提供的接口
  • 缺点

    • 新增产品时,需要编写新的具体产品类,还需要提供与之对应的具体工厂类。系统中类的个数将成对增加,在一定程度上增加了系统的复杂度
    • 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象度和理解难度
  • 使用场景 ★★★★★

    • 一个类不知道他所需要的对象的类:客户端需要知道创建具体产品的工厂类
    • 一个类通过其子类来指定创建哪个对象:在工厂方法模式中,对于抽象类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏替换原则,在程序运行时,子类对象将覆盖父类对象,从而使系统更容易扩展
    • 将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无需关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中


      工厂方法.png

抽象工厂模式

  • 概念

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类

  • 优点

    • 易于交换产品系列:由于具体工厂类在一个应用中只需要被实例化一次,这使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置
    • 它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中
  • 缺点

    • 在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及对抽象工厂角色及其所有子类的修改,显然会带来较大的不变
  • 使用场景★★★★★

    • 系统中有多于一个的产品组,而每次只使用其中某一产品组。可以通过配置文件动态改变产品组,如DB


      抽象工厂.png

建造者模式

  • 概念

    将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。个人理解:类似于KFC套餐的概念,不同的套餐就是具体的建造实现类

  • 优点

    • 客户端不必知道产品内部组成的细节,将产品本身和产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
    • 每一个具体建造者都相互独立,与其他具体建造者无关,可以方便的替代或新增
    • 可以更加精细的控制产品的创建过程
    • 新增建造者无需修改原有的代码,符合开闭原则
  • 缺点

    • 建造者模式创建的产品一般具有较多的共同点,其组成部分相似。如果产品之间的差异很大,则不适合使用建造者模式
    • 如果产品内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化
  • 使用场景★★☆☆☆

    • 需要生成的产品对象的属性相互依赖,需要指定其生成顺序
    • 对象的创建过程独立于创建该对象的类
    • 隔离复杂对象的创建和使用


      建造者.png

单例模式

  • 概念

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

  • 优点

    • 提供了对唯一实例的受控访问,它可以严格控制客户怎样以及何时访问它
    • 节约系统资源
  • 缺点

    • 由于单例模式中没有抽象层,因此单例类的扩展有很大困难
    • 单例类职责过重,一定程度上违背了”单一职责原则“。因为单例类既充当了工厂角色,提供工厂方法,同时又充当了产品角色,包含了一些业务方法,将产品的创建和产品本身的功能融合到一起
    • 滥用会带来负面问题,如为了节省资源将数据库连接池对象设计为单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出
  • 使用场景★★★★☆

    • 系统只需要一个实例对象。如系统要求提供一个唯一的序列号生成器
    • 客户调用类的单个实例只允许使用一个公共访问点,除了该访问点,不能通过其他路径访问


      单例.png

原型模式

  • 概念

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

  • 优点

    • 简化复杂对象的创建过程
    • 可以动态增加或减少产品类
    • 可以使用深克隆的方式保存对象的状态
  • 缺点

    • 需要为每一个类配备一个克隆方法,这个克隆方法需要对类的功能通盘考虑
    • 实现深克隆时需要编写较为复杂的代码
  • 使用场景★★★☆☆

    • 创建对象成本较大的场景


      原型.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。