创建型
- 共5种
- 工厂方法模式、抽象工厂模式、建造者模式、单例模式、原型模式
简单工厂模式
-
概念
又称为静态工厂方法模式,在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂不属于GOF设计模式
-
优点
客户端可以免除直接创建产品对象的责任,而仅仅是“消费”产品
-
缺点
不符合开闭原则,系统扩展困难
-
使用场景 ★★★★☆
- 工厂类负责创建的对象比较少。由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂
-
客户端只知道传入工厂类的参数,对于如何创建对象不关心,更不关心创建的细节
简单工厂.png
创建型
工厂方法模式
-
概念
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类
-
优点
- 工厂方法用来创建客户所需的产品,向客户隐藏了那个具体产品类将被实例化这一细节。用户只需关心产品对应的工厂,无需关心创建细节
- 它能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部
- 符合开闭原则,新增产品时,无需修改抽象工厂和抽象产品提供的接口
-
缺点
- 新增产品时,需要编写新的具体产品类,还需要提供与之对应的具体工厂类。系统中类的个数将成对增加,在一定程度上增加了系统的复杂度
- 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象度和理解难度
-
使用场景 ★★★★★
- 一个类不知道他所需要的对象的类:客户端需要知道创建具体产品的工厂类
- 一个类通过其子类来指定创建哪个对象:在工厂方法模式中,对于抽象类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏替换原则,在程序运行时,子类对象将覆盖父类对象,从而使系统更容易扩展
-
将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无需关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中
工厂方法.png
抽象工厂模式
-
概念
提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类
-
优点
- 易于交换产品系列:由于具体工厂类在一个应用中只需要被实例化一次,这使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置
- 它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中
-
缺点
- 在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及对抽象工厂角色及其所有子类的修改,显然会带来较大的不变
-
使用场景★★★★★
-
系统中有多于一个的产品组,而每次只使用其中某一产品组。可以通过配置文件动态改变产品组,如DB
抽象工厂.png
-
建造者模式
-
概念
将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。个人理解:类似于KFC套餐的概念,不同的套餐就是具体的建造实现类
-
优点
- 客户端不必知道产品内部组成的细节,将产品本身和产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
- 每一个具体建造者都相互独立,与其他具体建造者无关,可以方便的替代或新增
- 可以更加精细的控制产品的创建过程
- 新增建造者无需修改原有的代码,符合开闭原则
-
缺点
- 建造者模式创建的产品一般具有较多的共同点,其组成部分相似。如果产品之间的差异很大,则不适合使用建造者模式
- 如果产品内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化
-
使用场景★★☆☆☆
- 需要生成的产品对象的属性相互依赖,需要指定其生成顺序
- 对象的创建过程独立于创建该对象的类
-
隔离复杂对象的创建和使用
建造者.png
单例模式
-
概念
保证一个类仅有一个实例,并提供一个访问它的全局访问点
-
优点
- 提供了对唯一实例的受控访问,它可以严格控制客户怎样以及何时访问它
- 节约系统资源
-
缺点
- 由于单例模式中没有抽象层,因此单例类的扩展有很大困难
- 单例类职责过重,一定程度上违背了”单一职责原则“。因为单例类既充当了工厂角色,提供工厂方法,同时又充当了产品角色,包含了一些业务方法,将产品的创建和产品本身的功能融合到一起
- 滥用会带来负面问题,如为了节省资源将数据库连接池对象设计为单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出
-
使用场景★★★★☆
- 系统只需要一个实例对象。如系统要求提供一个唯一的序列号生成器
-
客户调用类的单个实例只允许使用一个公共访问点,除了该访问点,不能通过其他路径访问
单例.png
原型模式
-
概念
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
-
优点
- 简化复杂对象的创建过程
- 可以动态增加或减少产品类
- 可以使用深克隆的方式保存对象的状态
-
缺点
- 需要为每一个类配备一个克隆方法,这个克隆方法需要对类的功能通盘考虑
- 实现深克隆时需要编写较为复杂的代码
-
使用场景★★★☆☆
-
创建对象成本较大的场景
原型.png
-