首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何应用GOF设计模式中的创建型模式实现松耦合地创建对象实例

软件项目实训及课程设计指导——如何应用GOF设计模式中的创建型模式实现松耦合地创建对象实例

1、GOF设计模式中的工厂模式

在GOF设计模式的划分中,把与实现对象的实例化相关的模式称之为“创建型模式”——而其中的工厂模式为创建型模式中的一种具体实现形式。工厂模式主要是为创建对象提供一种接口,从而封装了创建对象的细节过程,使得对象的使用方根本无需关心这个目标对象是如何产生和创建的——也即能够达到将创建对象实例的职责与使用该对象实例的职责相互分开的目的。如下示例图中的程序代码片段为体现简单工厂设计模式编程特性的程序代码示例。

在软件应用系统的编程开发实现中,对使用new操作符语句来创建对象实例的应用方式,应该考虑是否可以采用工厂模式中的工厂类来代替。虽然这样编程实现可能在编码方面会使得编程实现人员要多做一些工作,但会给软件应用系统带来更大的可扩展性和良好的可维护性。下图所示为体现工厂模式中的各个类之间关系的UML类图。

而下图所示为工厂类ConnectDBFactory的具体实现的代码片段的图示,其中的static静态类型工厂方法newConnectDBBean接收需要创建对象的类名称参数,并返回目标对象所在的接口类型的对象实例。

static静态工厂方法在每次调用时,不要求非得创建一个新的工厂类对象的实例;static静态工厂方法还可以为重复形式的调用返回同一个对象(只需要设计为单例设计模式中的单例方法);静态工厂方法还可以返回一个原返回类型的子类型的对象——在java.util包中的Collections工具类中就有许多的静态方法(参见如下示图所示的方法定义),它们通过返回接口对象来引用被隐藏的实现类的对象实例。

2、GOF设计模式中的单例模式

(1)为什么要应用单例设计模式

所谓单例设计模式就是 只为某个类提供单一的对象实例,为什么要应用单例设计模式?应用的主要目的如下:

首先,可以避免重复地创建对象实例以节省系统资源,从而可以减少因为频繁的对象构造过程所带来的应用上的性能损失。

另外,在设备访问或者IO输出时也只允许有一个对象实例在访问操作——如控制打印机、磁盘文件IO访问等的应用环境,以保证对设备操作逻辑的正确性。;

最后的应用场景则可能是希望统一软件应用系统的执行入口点——如在Struts应用框架中的前端控制器ActionServlet组件则被设计为单例类。

(2)单例设计模式中的基本程序格式要求

软件应用系统的开发人员应该要明确单例设计模式中的基本程序格式要求如下:

首先,一个类能返回本类的一个对象引用(永远是同一个)和一个获得该对象实例的方法(该方法必须是static形式的静态方法,通常使用getInstance这个方法名称)。

其次,当调用这个static形式的getInstance方法时,如果类持有的对象引用不为空就直接返回这个对象引用,如果该类所持有的对象引用为空就创建出该类的对象实例——从而可以避免重复地进行对象实例的创建过程。

最后,还应该将单例类的构造方法定义为私有(private类型)方法,软件应用系统的开发人员也就无法直接通过调用该单例类的构造方法来实例化该类的对象实例,而只有通过在该单例类中提供的静态的getInstance方法得到该单例类的唯一对象实例。

下面的代码示例中所附的代码是实现单例对象创建的一种实现方式的代码示例,并请读者注意其中的黑体标识的代码。

public class Singleton {

private static final Singleton instance = new Singleton();

privateSingleton(){

}

public static synchronized Singleton getInstance() {

return instance;

}

}

在这个单例类的*.class类文件被Java虚拟机JVM程序加载时,其中的静态对象变量instance会被首先初始化,此时类的私有构造方法会被调用。这时候,单例类的唯一对象实例就被创建出来了。然后再通过提供一个供外部访问本单例类对象实例的static形式的静态方法,可以直接访问获得该单例类对象实例。

而下面的程序代码示例中所附的代码是实现单例对象创建的另一种实现方式的代码示例,同样也请读者注意其中的黑体标识的代码。

public class Singleton{

private static Singleton instance = null;

privateSingleton(){

}

public staticsynchronized Singleton getInstance(){

if (instance==null){

instance=new Singleton();

}

return instance;

}

}

这两种实现单例对象创建的程序代码示例在单例类的对象实例的创建时机上存在差别,上面程序代码中的代码示例中的这个单例类的实例直到getInstance()方法被第一次调用时才被创建。这种实现方法可以确保单例类的对象实例只有在需要时才被建立出来,对系统的性能有一定的优化作用。

当然,应用单例模式对软件应用系统的性能是有一定的影响的。另外,单例类不能被其子类天然地继承——因为其构造方法是private形式。

3、GOF设计模式中的享元模式

合理地应用享元设计模式能够避免大量拥有相同内容的小类的开销(如耗费系统内存空间),可以共享一个元类——享元设计模式的主要作用是实现对象实例的共享,从而减少内存分配的开销。

享元设计模式中的享元工厂负责创建和管理享元角色,并且必须保证享元对象可以被系统适当地共享——因为对象共享,所以要有一个统一的工厂来创建对象或从缓冲池中返回对象。

当一个客户端对象调用一个享元对象的时候,享元工厂对象会检查系统中是否已经有一个符合要求的享元对象。如果已经存在有了,享元工厂对象就直接提供这个已有的享元对象;如果系统中没有一个适当的享元对象,享元工厂对象则直接创建一个合适的享元对象。下图所示为在示例项目银行账户信息管理系统中应用享元设计模式的程序代码片段。

4、GOF设计模式中的构建者模式

构建者设计模式能够将一个复杂对象(它一般为组合类)的构建过程与它的表示部件相互分离,使得同样的构建过程可以创建出不同的表示部件——也就是希望所获得的目标组合对象(一般为大对象)不依赖于组成它的各个部件子对象。

从而可以分离和解耦“过程”和“部件”——为了将构建复合对象的“过程”和它的“部件”解耦——也就是实现将“零部件生产”和复合对象的“生产过程”相互分离,使得某个“过程”能够应用于不同的“复合对象”的创建工作。

构建者设计模式是满足面向对象OOP类设计中的“开放—封闭”设计原则的——由于一个复合对象是由各个部分的子对象所组成的,同时各个子对象部分又会经常变化,但组合在一起的算法(规则)却相对稳定。封装隔离这个复杂对象的各个变化的子对象部分,从而保持组合这些对象的算法的稳定性。

由于将各个零部件对象组合成为一个大的对象过程往往是很复杂的(比如汽车的总装配过程),为此可以将这些“零件”的组合过程“外部化”到一个称作创建者的对象中,创建者返还给客户端的是一个全部零件都建造完毕的最终产品对象。

如下示例图为构建者设计模式的UML类图,从UML类图中可以了解到构建者设计模式在编程实现方面的核心要求是在指导者Director类中,内聚一个建造者对象。

项目及课程设计指导——如何合理创建对象实例以降低程序类之间关系的耦合度

如何正确地应用Web MVC架构模式分离表示层和模型处理层耦合关系

软件项目实训及课程设计指导——Web表示层典型功能实现的应用实例

如何合理地设计软件应用系统中数据访问服务层内的各个程序类的结构及关系

如何应用数据访问服务层分离应用系统中的业务层和持久层之间依赖耦合关系

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201207A0EVNB00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券