`

复杂对象创建--抽象工厂模式

阅读更多

什么是复杂对象

 

所谓复杂对象,指的是对象的成员变量是由一系列的其他对象组成,其中每对象的创建和赋值都是单独的业务逻辑。如果把这个复杂对象称为一个产品,那组成的这个对象的一系列其他对象称为产品簇。比如也一个“页面对象”,是由基本信息对象头部对象主体对象底部对象组成。这个“页面对象”就是一个复杂对象,而其他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对应的实例”说明:这个类图没有画出两个大对象对应的类:PcPagepc页面)和Mapgem页面),这两个类的实例对象就是“RichPage对应的实例”,它们都继承自基类RichPageRichPage中提取了每个页面的共性即:每个页面都是由4个部分组成 Header(头部)Body(主体)Footer(底部)PageInfo(页面基本信息)组成:



 

 

下面开始展示上述类图对应的业务逻辑实现,我们大致把实现过程分为三部分:产品簇页面组成部分、工厂类创建页面组成部分、“RichPage对应的实例具体的页面对象(即 大对象PcPageMPage)。

 

产品簇

 

本示例中的产品簇分别为:HeaderBodyFooterPageInfo,并且各自对应有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(PcBodyMBody)Footer(PcFooterMBody)PageInfo(PcPageInfoMPageInfo)实现过程类似,这不再累述。

 

工厂类

 

工厂类分为:抽象的工厂接口(也可以是抽象类)、具体的工厂实现类,这里需要创建两类对象PcPageMPage,所以有两个具体的工厂实现类:

//抽象的工厂接口
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();
    }
}

这里具体的工厂实现类PCPageFactoryMPageFactory,需要说明的是 它们不是直接返回整个页面对象(PcPageMPage对象),而是有4个方法分别用于创建页面的4个部分。

 

具体的页面对象“RichPage对应的实例

 

RichPage是页面基类,定义了页面的公共组成部分。PcPageMPageRichPage的具体实现类,分别对应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方法
}
 

 

PcPageMPage的实现,是通过调用不同的工厂对象 对应的方法来完成各个部分的创建,最终完成对象整体的创建,这就是“抽象工厂”模式的精髓。如果将来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页面整体创建完成
 

 

小结

 

抽象工厂模式,可以用于封装一系列复杂对象的创建过程,每一类对象都对应一个独立的工厂类,客户端使用时不必在意对象创建的具体细节。同时一定程度上满足开闭原则,创建新的工厂类无需修改已有代码,添加新的组成部分 会修改所有的工厂类(添加新的方法)。

 

 

  • 大小: 36.1 KB
  • 大小: 5.7 KB
0
0
分享到:
评论

相关推荐

    设计模式:单例设计模式(全部实现方式)工厂设计模式,抽象工厂模式

    抽象工厂模式是一种创建型设计模式,它的主要目标是提供一个接口或抽象类,用于创建一系列相关或依赖的对象。该模式的主要优点在于,它可以为客户端代码提供一个统一的接口,使得客户端无需关心具体实现细节。抽象...

    设计模式 创建型模式 Abstract Factory模式(抽象工厂)

    1 定义创建对象的接口,并封装对象的创建 2 将具体化类的工作延迟到了类中 3 创建创建一组相关对象或者说是一组相互依赖的对象 一般情况下,我们为了提高内聚和松耦合,经常会使用多态来处理一些问题。抽象出...

    设计模式:可复用面向对象软件的基础--详细书签版

    3.1 abstract factory(抽象工厂)— 对象创建型模式 57 3.2 builder(生成器)—对象创建型 模式 63 3.3 factory method(工厂方法)— 对象创建型模式 70 3.4 prototype(原型)—对象创建型 模式 87 3.5 ...

    design-pattern-java.pdf

    Factory Method Pattern 工厂三兄弟之工厂方法模式(一) 工厂三兄弟之工厂方法模式(二) 工厂三兄弟之工厂方法模式(三) 工厂三兄弟之工厂方法模式(四) 抽象工厂模式-Abstract Factory Pattern 工厂三兄弟之...

    java设计模式 创建型 构造型 行为型

    如,工厂方法、抽象工厂模式、单例模式等。 构造型 用于帮助将多个对象组织成更大的结构。如,适配器模式、桥接模式、组合器模式等。 行为型 用于帮助系统间对象的通信,以及如何控制复杂系统中的流程。如,命令...

    设计模式 创建型模式 Complex Factory模式(复杂工厂)

    为了应对这种变化我们抽象出它比较稳定的接口,隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变,这就是我们经常谈的Factory模式了。 详细见博客 ...

    (创建模式 上)设计模式——工厂、抽象工厂 C++/Python3实现

    创建型模式顾名思义是处理对象创建的设计模式,降低复杂度,创建复杂对象时使用。 工厂模式 在类中实现一个接口创建指定对象,使一个类的实例化延迟到了子类。简单来说把类的创建都封装起来,只需要调用一个子类

    Java23种设计模式详解,看这一个就够了

    1、抽象工厂模式是提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。 2、建造模式是将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。 3、工厂方法模式定义一个...

    设计模式之创建型模式

    通过对设计模式的学习和了解,以C#语言实践了... 如果遇到“易变类”,起初的设计通常从FactoryMethod开始,当遇到更多的复杂变化时,再考虑重构为其他三种工厂模式( Abstract Factory,Builder , Prototype )。

    Java设计模式 版本2

    Java设计模式,目录:前言,UML建模技术,深入浅出UML类图,从招式与内功谈起——设计模式概述,面向对象设计原则,工厂三兄弟之简单工厂模式,工厂三兄弟之工厂方法模式,工厂三兄弟之抽象工厂模式,确保对象的唯一...

    设计模式整理(很全)

    创建模式 设计模式之Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之Factory(工厂方法和抽象工厂) 使用工厂模式就象使用new一样频繁....

    设计模式 创建型模式 Simple Factory模式(简单工厂)

    为了应对这种变化我们抽象出它比较稳定的接口,隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变,这就是我们经常谈的Factory模式了。 详细见博客 ...

    23种设计模式的基本介绍

    创建型模式(Creational Pattern) 1、 抽象工厂模式(Abstract Factory Pattern) 介绍 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 2、 建造者模式(Builder Pattern) 介绍 将一个复杂对象...

    JAVA设计模式23种

    设计模式之Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new一样频繁. 设计模式之Builder 汽车由车轮 方向盘 发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,Builder模式就是将这两 种...

    设计模式python模版

    抽象工厂模式(Abstract Factory):创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 建造者模式(Builder):将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 原型模式...

    23种设计模式入门到精通详解.txt

    抽象工厂:创建相关或依赖对象的家族,而无需明确指定具体类。 建造者模式:封装一个复杂对象的构建过程,并可以按步骤构造。 原型模式:通过复制现有的实例来创建新的实例。 适配器模式:将一个类的方法接口...

    JAVA23种设计模式及快捷记忆

    工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式、适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式、策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、...

    设计模式 GOF 23

    3.1 Abstract Factory(抽象工厂)— 对象创建型模式 57 3.2 Builder(生成器)—对象创建型 模式 63 3.3 Factory Method(工厂方法)— 对象创建型模式 70 3.4 Prototype(原型)—对象创建型 模式 87 3.5 ...

    GoF 的 23 种设计模式

    建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。 代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地...

Global site tag (gtag.js) - Google Analytics