什么是复杂对象
所谓复杂对象,指的是对象的成员变量是由一系列的其他对象组成,其中每对象的创建和赋值都是单独的业务逻辑。如果把这个复杂对象称为一个产品,那组成的这个对象的一系列其他对象称为“产品簇”。比如也一个“页面对象”,是由“基本信息对象”、“头部对象”、“主体对象”、“底部对象”组成。这个“页面对象”就是一个复杂对象,而其他4个构成这个页面的对象就是一个“产品簇”。“页面对象”又可能分为很多类,比如pc页面(电脑版)、M页面(移动版),其对应头部、底部等组成部分也不同。
对于这种复杂对象的创建,可以使用“抽象工厂”模式完成。在实例讲解如何创建一个上述“页面对象”之前,先来看看这个模式。
抽象工厂模式
抽象工厂模式提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确制定具体类。核心思想是:具体的工厂类封装了“产品簇”对象的创建业务逻辑,并把这个具体的工厂类对象作为“复杂对象”的成员变量,并在“复杂对象”初始化的过程中分别调用该工厂类对象create方法实例化“产品簇”对象 并赋值给“复杂对象”的各个成员,完成对象的创建过程与赋值。
抽象工厂模式 的类图看起来比较复杂 本质上是对一个大对象创建过程的封装。以文章开头的场景为例,目标创建对象是 pc页面(电脑版)和M页面(移动版)两类页面,所以就需要两个工程实例类,对应两套产品簇,类图如下:
<!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Visio.Drawing.11" ShapeID="_x0000_i1025" DrawAspect="Content" ObjectID="_1571843664"> </o:OLEObject> </xml><![endif]-->
虽然比较复杂,但总体上分为三部分:红色框部分表示“工厂类”;紫色框部分表示“产品簇”;黑色框部分“RichPage对应的实例”,这个就是最终创建出来的具体的大对象,类图中累没有详细标明,下面来详细分析下这部分。
“RichPage对应的实例”说明:这个类图没有画出两个大对象对应的类:PcPage(pc页面)和Mapge(m页面),这两个类的实例对象就是“RichPage对应的实例”,它们都继承自基类RichPage,RichPage中提取了每个页面的共性即:每个页面都是由4个部分组成 Header(头部)、Body(主体)、Footer(底部)、PageInfo(页面基本信息)组成:
下面开始展示上述类图对应的业务逻辑实现,我们大致把实现过程分为三部分:“产品簇”页面组成部分、“工厂类”创建页面组成部分、“RichPage对应的实例”具体的页面对象(即 大对象PcPage和MPage)。
产品簇
本示例中的产品簇分别为:Header、Body、Footer、PageInfo,并且各自对应有pc版和m版的实现,这里以Header为例:
public abstract class Header { //这里可以设置一些公共方法或成员变量 } pc版头部实现: public class PcHeader extends Header { public PcHeader() { System.out.println("pc页面头部对象创建完成"); } //省略getter、setter方法 } m版头部实现: public class MHeader extends Header { public MHeader() { System.out.println("M页面头部对象创建完成"); } //省略getter、setter方法 }
可以看到都是基础的pojo类,其他部分Body(PcBody、MBody)、Footer(PcFooter、MBody)、PageInfo(PcPageInfo、MPageInfo)实现过程类似,这不再累述。
工厂类
工厂类分为:抽象的工厂接口(也可以是抽象类)、具体的工厂实现类,这里需要创建两类对象PcPage和MPage,所以有两个具体的工厂实现类:
//抽象的工厂接口 public interface PageFactory { //创建 页面基本信息对象 PageInfo createPageInfo(); //创建 页面头部对象 Header createHeader(); //创建 页面主体对象 Body createBody(); //创建 页面底部对象 Footer createFooter(); } /** * pc页面对象创建工厂实现类 * Created by gantianxing on 2017/10/19. */ public class PCPageFactory implements PageFactory { public PageInfo createPageInfo() { //这里省略创建过程,一般会查询数据库或者用户输入数据 return new PcPageInfo(); } public Header createHeader() { //这里省略创建过程,一般会查询数据库或者用户输入数据 return new PcHeader(); } public Body createBody() { //这里省略创建过程,一般会查询数据库或者用户输入数据 return new PcBody(); } public Footer createFooter() { //这里省略创建过程,一般会查询数据库或者用户输入数据 return new PcFooter(); } } public class MPageFactory implements PageFactory { public PageInfo createPageInfo() { //这里省略创建过程,一般会查询数据库或者用户输入数据 return new MPageInfo(); } public Header createHeader() { //这里省略创建过程,一般会查询数据库或者用户输入数据 return new MHeader(); } public Body createBody() { //这里省略创建过程,一般会查询数据库或者用户输入数据 return new MBody(); } public Footer createFooter() { //这里省略创建过程,一般会查询数据库或者用户输入数据 return new MFooter(); } }
这里具体的工厂实现类PCPageFactory、MPageFactory,需要说明的是 它们不是直接返回整个页面对象(PcPage或MPage对象),而是有4个方法分别用于创建页面的4个部分。
具体的页面对象“RichPage对应的实例”
RichPage是页面基类,定义了页面的公共组成部分。PcPage和MPage是RichPage的具体实现类,分别对应pc页面和m页面。首先看下RichPage的实现:
/** * 完整的页面对象 * Created by gantianxing on 2017/10/19. */ public abstract class RichPage { //页面基本信息 private PageInfo pageInfo; //页面头部 private Header header; //页面主题 private Body body; //页面底部 private Footer footer; //创建页面对象方法,留给具体的子类实现 public abstract void create(); //省略getter和setter方法 }
PcPage和MPage的实现,是通过调用不同的工厂对象 对应的方法来完成各个部分的创建,最终完成对象整体的创建,这就是“抽象工厂”模式的精髓。如果将来Header部分需要调整,涉及的代码修改只会被控制在很小的范围;如果将来页面类需要新增一个组成部分(比如”顶部通用菜单”),原来已经实现的4个部分不需要做任何修改:
/** * pc页面对象 * Created by gantianxing on 2017/10/19. */ public class PcPage extends RichPage { //页面生产工厂 private PageFactory pageFactory; public PcPage(PageFactory pageFactory) { this.pageFactory = pageFactory; create(); } @Override public void create() { this.setPageInfo(pageFactory.createPageInfo()); this.setHeader(pageFactory.createHeader()); this.setBody(pageFactory.createBody()); this.setFooter(pageFactory.createFooter()); System.out.println("m页面整体创建完成"); System.out.println(" "); } } /** * m页面对象 * Created by gantianxing on 2017/10/19. */ public class MPage extends RichPage { //M页面生产工厂 private MPageFactory mPageFactory; public MPage(MPageFactory mPageFactory) { this.mPageFactory = mPageFactory; create(); } @Override public void create() { this.setPageInfo(mPageFactory.createPageInfo()); this.setHeader(mPageFactory.createHeader()); this.setBody(mPageFactory.createBody()); this.setFooter(mPageFactory.createFooter()); System.out.println("m页面整体创建完成"); System.out.println(" "); } }
到这里,使用“抽象工厂”模式创建“pc页面”或“m页面”(大对象)的代码实现已经完成。下面进入测试环节。
测试示例
测试代码很简单,分别创建一个pc页面和m页面:
public class Main { public static void main(String[] args) { //创建一个pc页面开始 PCPageFactory pcPageFactory = new PCPageFactory(); RichPage pcPage = new PcPage(pcPageFactory); //创建一个pc页面结束 //创建一个M页面开始 MPageFactory mPageFactory = new MPageFactory(); RichPage mPage = new MPage(mPageFactory); //创建一个M页面结束 } }
执行main方法,打印结果为:
pc页面基本信息对象创建完成 pc页面头部对象创建完成 pc页面主体对象创建完成 pc页面底部对象创建完成 pc页面整体创建完成 m页面基本信息对象创建完成 M页面头部对象创建完成 M页面主体对象创建完成 M页面底部对象创建完成 m页面整体创建完成
小结
抽象工厂模式,可以用于封装一系列复杂对象的创建过程,每一类对象都对应一个独立的工厂类,客户端使用时不必在意对象创建的具体细节。同时一定程度上满足“开闭原则”,创建新的工厂类无需修改已有代码,添加新的组成部分 会修改所有的工厂类(添加新的方法)。
相关推荐
抽象工厂模式是创建型设计模式的一种,它提供了一种创建对象族(一组具有相互依赖关系的对象)的方法,而无需指定具体类。这种模式的核心在于它允许客户端代码与具体实现细节解耦,使得更换一个产品族变得更为容易。...
抽象工厂模式是创建型设计模式中的一种,用于创建一系列相关或相互依赖的对象,而无需指定其具体类。抽象工厂模式强调产品的系列,对于有多个产品等级结构的系统非常有用。在抽象工厂模式中,一个工厂负责创建多个...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许系统独立于如何创建、组合和表示产品对象的细节进行设计,为产品族(一组相关或相互依赖的对象)提供...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象族的接口,而无需指定其具体的类。这种模式的关键在于“族”,即一系列相关的对象。在抽象工厂模式中,我们创建一个抽象工厂接口,然后为每一种具体...
3. **抽象工厂模式** 关注对象族的创建,适用于需要在不同环境中创建一系列相关对象的情况,但结构较为复杂,增加新环境时需改动较多代码。 在实际应用中,开发者应根据项目需求和预期的扩展性来选择合适的工厂模式...
在Java中,抽象工厂模式提供了一种创建对象组的方式,使得这些对象属于同一族,并且能够遵循相同的接口,但具体的实现可以不同。 首先,我们来理解一下抽象工厂模式的主要组成: 1. **抽象工厂(Abstract Factory...
* 抽象工厂模式适合用于创建复杂对象或需要多步骤创建的对象。 * 抽象工厂模式需要定义多个工厂类和产品类,从而增加了代码的复杂度。 * 抽象工厂模式可以与其他设计模式结合使用,例如工厂方法模式、单例模式等。 ...
在汽车调音系统中,不同的汽车品牌可能需要不同类型的调音设备,例如扬声器、功放等,这就是抽象工厂模式的应用场景。 在C#中,我们可以定义一个抽象工厂接口,比如`ICarTuningFactory`,它包含创建各种调音设备的...
总结来说,"JAVA抽象工厂模式--演示代码"将展示如何在Java中应用这一模式,通过创建和使用抽象工厂,来实现对象族的动态创建,同时保持代码的松耦合和可扩展性。测试用例则会验证这些功能是否按照预期工作。
通过运行这些测试,我们可以验证抽象工厂模式是否正确地工作,确保不同系列的产品可以正确创建,并且客户端代码可以不关心具体的实现细节。 总的来说,抽象工厂设计模式是一种强大的工具,它有助于在复杂系统中保持...
工厂模式分为三种主要类型:简单工厂模式、普通工厂模式(也称为工厂方法模式)和抽象工厂模式。 1. **简单工厂模式**: - 简单工厂模式中,有一个中心工厂类,它负责根据输入条件(通常是一个参数)来创建具体的...
抽象工厂模式是设计模式中的一种,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在软件工程中,当系统需要在运行时选择不同的产品族时,或者想要隔离具体产品的实现细节时,抽象工厂...
抽象工厂模式是一种创建型设计模式,它能够让我们从一个公共接口中创建一系列相关或相互依赖的对象,而无需指定它们的具体类。该模式的核心在于提供了一个高层接口,使得我们可以创建一组相关的对象,这些对象通常...
抽象工厂模式是一种面向对象的设计模式,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在C#中,这种模式经常用于软件工程中的框架设计,允许系统独立于具体产品的实现进行扩展和修改。...
简单工厂模式、工厂方法模式和抽象工厂模式是设计模式中三种常见的工厂模式,它们都是用于对象创建的,目的是为了将对象的创建过程封装起来,从而提高代码的灵活性和可维护性。 **简单工厂模式** 是最基础的工厂...
总的来说,抽象工厂设计模式是一种强大的工具,它能够帮助我们构建更灵活、模块化的软件系统,同时隔离了对象创建的复杂性,使代码更加易于维护和扩展。在处理跨平台、多组件场景时,这种模式尤其有用。
**Java设计模式——抽象工厂** 在软件工程中,设计模式是一种在特定场景下解决常见问题的模板或蓝图。...通过学习抽象工厂模式,开发者可以更好地处理复杂的对象创建逻辑,提升软件的灵活性和可维护性。
抽象工厂模式是一种设计模式,属于创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式的主要目的是为了隔离产品对象的创建和使用,使得客户端代码可以独立于具体的产品实现。在软件工程中,...
1. 抽象工厂模式使得系统更加抽象和复杂,增加了系统的理解难度。 2. 如果增加新的产品等级结构,需要修改抽象工厂接口,这违背了开闭原则。 **五、实际案例** 在Java中,`java.sql`包中的`DriverManager`类可以...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体类。这种模式的主要目的是为了隔离产品对象的创建和使用,使得系统对产品类的依赖降低到最低,同时也方便了产品的扩展和...