设计模式——设计原则与创建型模式

设计模式

image-20200726145655909箭头指向父类 接口实现 image-20200726150318844 箭头指向被包含的对象 关联 image-20200726150359987 菱形指向整体 组合 image-20200823113921842

创建型模式

在软件工程中,创建型模式是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象。基本的对象创建方式可能会导致设计上的问题,或增加设计的复杂度。创建型模式通过以某种方式控制对象的创建来解决问题。

创建型模式由两个主导思想构成。一是将系统使用的具体类封装起来,二是隐藏这些具体类的实例创建和结合的方式。

创建型模式又分为对象创建型模式和类创建型模式。对象创建型模式处理对象的创建,类创建型模式处理类的创建。详细地说,对象创建型模式把对象创建的一部分推迟到另一个对象中,而类创建型模式将它对象的创建推迟到子类中。

一、工厂模式

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。如

这段代码说明了Vehicle与Car两个类之间的依赖关系,这样的依赖关系使得代码紧密耦合,在不更改的情况下很难扩展。假设要用bike替换car,就必须要使用

这就存在两个问题:

  • 类应该保持对扩展的开放与对修改的关闭(开闭原则)
  • 每个类应该只有一个发生变化的原因(单一职责原则)

每增加新的类造成主要代码修改时会打破开闭原则,而主类除了其固有的功能之外还负责实例化对象,这种行为将会打破单一职责原则。此时可以使用简单工厂模式,来增加一个新类来负责实例化vehicle对象。

1.1 简单工厂模式

工厂模式用于实现逻辑的封装,并通过公共的接口提供对象的实例化服务,在添加新的类时只需做少量的修改即可。在创建一个对象时不向客户暴露内部细节,只提供一个创建对象的通用接口。

image-20200824213642260
  • 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现
  • 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象
  • 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现
  • 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现

继承自抽象工厂类的多个具体工厂类分担了工厂承受的压力。当有新的产品需求时,只需要创建一个新的继承抽象工厂类的具体工厂类即可,不需更改原先的工厂方法,符合了开闭原则。但是随之而来的是,当有非常多的新需求时,就会出现相应的具体工厂类对象,所以抽象工厂方法应运而生。

1.3 抽象工厂方法

抽象工厂方法是工厂方法模式的扩展版本。它不再是创建单一类型的对象,而是创建一系列相关联的对象。如果说工厂方法模式只包含一个抽象产品类,那么抽象工厂模式则包含多个抽象产品类。

工厂方法类中只有一个抽象方法,在不同的具体工厂类中分别实现抽象产品的实例化;而抽象工厂类中,每个抽象产品都有一个实例化方法。抽象工厂模式和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。

设计模式——设计原则与创建型模式

二、单例模式

单例模式:用来保证一个对象只能创建一个实例,除此之外,他还提供了对实例的全局访问方法。

image-20200829111606067

单例模式的实现非常简单,只由单个类组成。为确保单例实例的唯一性,所有的单例构造器都要被声明为私有的(private),再通过声明静态(static)方法实现全局访问获得该单例实例。

单例模式有以下特点:

  • 单例类只能有一个实例
  • 单例类必须自己创建自己的唯一实例
  • 单例类必须给所有其他对象提供这一实例

**单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。**在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。

来源:我姓弓长那个张

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年6月7日
下一篇 2021年6月7日

相关推荐