设计模式学习笔记——抽象工厂(Abstract Factory)模式

@(设计模式)[设计模式, 设计模式中文名, 设计模式英文名]

  • 设计模式学习笔记抽象工厂Abstract Factory模式

    • 基本介绍
    • 抽象工厂案例
      • 抽象工厂的框架类

        • Item抽象类
        • Link抽象类
        • Tray抽象类
        • Page抽象类
        • Factory抽象类
      • List实现
        • 类图
        • 实现代码
          • ListLink类
          • ListTray类
          • ListPage类
          • ListFactory类
        • 测试类
        • 运行结果
          • 控制台输出
          • E盘下网站介绍列表版html的内容
          • 浏览器中运行结果
      • Table实现
        • 类图
        • 实现代码
          • TableLink类
          • TableTray类
          • TablePage类
          • TableFactory类
        • 测试类
        • 运行结果
          • 控制台输出
          • E盘下网站介绍表格版html的内容
          • 浏览器中运行结果
    • 抽象工厂模式中的角色
      • AbstractProduct抽象产品
      • AbstractFactory抽象工厂
      • Client委托者
      • ConcreteProduct具体产品
      • ConcreteFactory具体工厂
      • 类图

基本介绍

在抽象工厂模式中不仅有“抽象工厂”,还有”抽象零件”和”抽象产品” 。抽象工厂的工作是将”抽象零件”组装为”抽象产品” 。

在抽象工厂模式中并不关心零件的具体实现,而是只关心接口(API)。仅使用该接口(API) 将零件组装成为产品。

在模版模式和建造者模式中,子类这一层负责方法的具体实现。在在抽象工厂模式中也是一样的。在子类这一层中有具体的工厂,它负责将具体的零件组装成为具体的产品。

在抽象工厂模式中,我们可以很方便的创建不同种的实现。但是如果要添加新的“零件”确实非常困难的事,要修改所有的实现工厂类。

抽象工厂案例

抽象工厂的框架类

Item抽象类

package com.pc.abstractfactory.example.factory;/*** HTML中的一项(抽象零件)* Created by Switch on 2017-02-17.*/
public abstract class Item {// 标题protected String caption;/*** 构造方法,传入标题** @param caption 标题*/public Item(String caption) {this.caption = caption;}/*** 创建HTML** @return HTML格式的字符串*/public abstract String makeHTML();
}

Link抽象类

package com.pc.abstractfactory.example.factory;/*** 链接类(抽象零件)* Created by Switch on 2017-02-17.*/
public abstract class Link extends Item {// urlprotected String url;/*** 构造方法,传入标题和URL** @param caption 标题* @param url     url*/public Link(String caption, String url) {super(caption);this.url = url;}
}

Tray抽象类

package com.pc.abstractfactory.example.factory;import java.util.ArrayList;
import java.util.List;/*** 存放多个HTML项(抽象零件)* Created by Switch on 2017-02-17.*/
public abstract class Tray extends Item {// HTML项列表protected List<Item> items = new ArrayList<>();/*** 构造方法,传入标题** @param caption 标题*/public Tray(String caption) {super(caption);}/*** 添加HTML项** @param item HTML项*/public void add(Item item) {this.items.add(item);}
}

Page抽象类

package com.pc.abstractfactory.example.factory;import java.io.FileWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;/*** 页面类(抽象产品)* Created by Switch on 2017-02-17.*/
public abstract class Page {// 标题protected String title;// 作者protected String author;// 页面内容列表protected List<Item> items = new ArrayList<>();/*** 构造方法,传入标题和作者** @param title  标题* @param author 作者*/public Page(String title, String author) {this.title = title;this.author = author;}/*** 添加HTML项到内容给列表** @param item HTML项*/public void add(Item item) {this.items.add(item);}public void output() {try {// 创建文件,并使用makeHTML将内容输出到文件中String filename = title + ".html";Writer writer = new FileWriter("E:\\" + filename);writer.write(this.makeHTML());writer.close();System.out.println(filename + "已编写完成。");} catch (Exception e) {e.printStackTrace();}}/*** 创建HTML** @return HTML格式的字符串*/public abstract String makeHTML();}

Factory抽象类

package com.pc.abstractfactory.example.factory;/*** 抽象工厂类* Created by Switch on 2017-02-17.*/
public abstract class Factory {/*** 获取工厂** @param className 全限定符的类名* @return 工厂对象*/public static Factory getFactory(String className) {Factory factory = null;try {factory = (Factory) Class.forName(className).newInstance();} catch (Exception e) {e.printStackTrace();}return factory;}/*** 创建链接** @param caption 标题* @param url     url* @return 链接对象*/public abstract Link createLink(String caption, String url);/*** 创建Tray** @param caption 标题* @return Tray对象*/public abstract Tray createTray(String caption);/*** 创建页面** @param title  标题* @param author 作者* @return 页面对象*/public abstract Page createPage(String title, String author);}

List实现

类图

实现代码

ListLink类
package com.pc.abstractfactory.example.listfactory;import com.pc.abstractfactory.example.factory.Link;/*** 列表链接类* Created by Switch on 2017-02-17.*/
public class ListLink extends Link {/*** 构造方法,传入标题和URL** @param caption 标题* @param url     url*/public ListLink(String caption, String url) {super(caption, url);}@Overridepublic String makeHTML() {return "<li><a href='" + super.url + "'>" + super.caption + "</a></li>\n";}
}
ListTray类
package com.pc.abstractfactory.example.listfactory;import com.pc.abstractfactory.example.factory.Item;
import com.pc.abstractfactory.example.factory.Tray;/*** 列表Tray类* Created by Switch on 2017-02-17.*/
public class ListTray extends Tray {/*** 构造方法,传入标题** @param caption 标题*/public ListTray(String caption) {super(caption);}@Overridepublic String makeHTML() {// 创建StringBuilder对象StringBuilder builder = new StringBuilder();// 将HTML暂存至StringBuilder对象builder.append("<li>\n");builder.append(super.caption + "\n");builder.append("<ul>\n");for (Item item : items) {builder.append(item.makeHTML());}builder.append("</ul>\n");builder.append("</li>\n");// 转化为Stringreturn builder.toString();}
}
ListPage类
package com.pc.abstractfactory.example.listfactory;import com.pc.abstractfactory.example.factory.Item;
import com.pc.abstractfactory.example.factory.Page;/*** 列表页面类* Created by Switch on 2017-02-17.*/
public class ListPage extends Page {/*** 构造方法,传入标题和作者** @param title  标题* @param author 作者*/public ListPage(String title, String author) {super(title, author);}@Overridepublic String makeHTML() {// 创建StringBuilder对象StringBuilder builder = new StringBuilder();builder.append("<html><head><title>" + super.title + "</title>\n");builder.append("<meta charset='utf-8'/>\n");builder.append("</head>\n");builder.append("<body>\n");builder.append("<h1>" + super.title + "</h1>\n");builder.append("<ul>\n");for (Item item : items) {builder.append(item.makeHTML());}builder.append("</ul>\n");builder.append("<hr/><address>" + this.author + "</address>\n");builder.append("</body></html>\n");// 转化为Stringreturn builder.toString();}
}
ListFactory类
package com.pc.abstractfactory.example.listfactory;import com.pc.abstractfactory.example.factory.Factory;
import com.pc.abstractfactory.example.factory.Link;
import com.pc.abstractfactory.example.factory.Page;
import com.pc.abstractfactory.example.factory.Tray;/*** Created by Switch on 2017-02-17.*/
public class ListFactory extends Factory {@Overridepublic Link createLink(String caption, String url) {return new ListLink(caption, url);}@Overridepublic Tray createTray(String caption) {return new ListTray(caption);}@Overridepublic Page createPage(String title, String author) {return new ListPage(title, author);}
}

测试类

package com.pc.abstractfactory.example.listfactory.test;import com.pc.abstractfactory.example.factory.Factory;
import com.pc.abstractfactory.example.factory.Link;
import com.pc.abstractfactory.example.factory.Page;
import com.pc.abstractfactory.example.factory.Tray;
import org.junit.Test;/*** 测试ListFactory* Created by Switch on 2017-02-17.*/
public class ListFactoryTest {@Testpublic void testListFactory() {Factory factory = Factory.getFactory("com.pc.abstractfactory.example.listfactory.ListFactory");Link blog = factory.createLink("博客", "http://blog.csdn.net/q547550831");Link github = factory.createLink("Github", "http://www.github.com/Switch-vov");Tray mySite = factory.createTray("个人网站");mySite.add(blog);mySite.add(github);Link alibaba = factory.createLink("Alibaba", "http://www.alibaba.com");Link baidu = factory.createLink("Baidu", "http://www.baidu.com");Tray portal = factory.createTray("大型网站");portal.add(alibaba);portal.add(baidu);Page page = factory.createPage("网站介绍(列表版)", "Switch");page.add(mySite);page.add(portal);page.output();}
}

运行结果

控制台输出
网站介绍(列表版).html已编写完成。
E盘下网站介绍(列表版).html的内容
<html><head><title>网站介绍(列表版)</title>
<meta charset='utf-8'/>
</head>
<body>
<h1>网站介绍(列表版)</h1>
<ul>
<li>
个人网站
<ul>
<li><a href='http://blog.csdn.net/q547550831'>博客</a></li>
<li><a href='http://www.github.com/Switch-vov'>Github</a></li>
</ul>
</li>
<li>
大型网站
<ul>
<li><a href='http://www.alibaba.com'>Alibaba</a></li>
<li><a href='http://www.baidu.com'>Baidu</a></li>
</ul>
</li>
</ul>
<hr/><address>Switch</address>
</body></html>
浏览器中运行结果

Table实现

类图

实现代码

TableLink类
package com.pc.abstractfactory.example.tablefactory;import com.pc.abstractfactory.example.factory.Link;/*** 表格链接类* Created by Switch on 2017-02-17.*/
public class TableLink extends Link {/*** 构造方法,传入标题和URL** @param caption 标题* @param url     url*/public TableLink(String caption, String url) {super(caption, url);}@Overridepublic String makeHTML() {return "<td><a href='" + super.url + "'>" + super.caption + "</a></td>";}
}
TableTray类
package com.pc.abstractfactory.example.tablefactory;import com.pc.abstractfactory.example.factory.Item;
import com.pc.abstractfactory.example.factory.Tray;/*** 表格Tray类* Created by Switch on 2017-02-17.*/
public class TableTray extends Tray {/*** 构造方法,传入标题** @param caption 标题*/public TableTray(String caption) {super(caption);}@Overridepublic String makeHTML() {// 创建StringBuilder对象StringBuilder builder = new StringBuilder();// 将HTML暂存至StringBuilder对象builder.append("<td>");builder.append("<table width='100%' border='l'><tr>");builder.append("<td bgcolor='#cccccc' align='center' colspan='" + super.items.size() + "'><b>" + caption + "</b></td>");builder.append("</tr>\n");builder.append("<tr>\n");for (Item item : items) {builder.append(item.makeHTML());}builder.append("</tr></table>");builder.append("</td>");// 转化为Stringreturn builder.toString();}
}
TablePage类
package com.pc.abstractfactory.example.tablefactory;import com.pc.abstractfactory.example.factory.Item;
import com.pc.abstractfactory.example.factory.Page;/*** 表格页面类* Created by Switch on 2017-02-17.*/
public class TablePage extends Page {/*** 构造方法,传入标题和作者** @param title  标题* @param author 作者*/public TablePage(String title, String author) {super(title, author);}@Overridepublic String makeHTML() {// 创建StringBuilder对象StringBuilder builder = new StringBuilder();builder.append("<html><head><title>" + super.title + "</title>\n");builder.append("<meta charset='utf-8'/>\n");builder.append("</head>\n");builder.append("<body>\n");builder.append("<h1>" + super.title + "</h1>\n");builder.append("<table width='80%' border='3'>\n");for (Item item : items) {builder.append(item.makeHTML());}builder.append("</table>\n");builder.append("<hr/><address>" + this.author + "</address>\n");builder.append("</body></html>\n");// 转化为Stringreturn builder.toString();}
}
TableFactory类
package com.pc.abstractfactory.example.tablefactory;import com.pc.abstractfactory.example.factory.Factory;
import com.pc.abstractfactory.example.factory.Link;
import com.pc.abstractfactory.example.factory.Page;
import com.pc.abstractfactory.example.factory.Tray;/*** 表格工厂类* Created by Switch on 2017-02-17.*/
public class TableFactory extends Factory {@Overridepublic Link createLink(String caption, String url) {return new TableLink(caption, url);}@Overridepublic Tray createTray(String caption) {return new TableTray(caption);}@Overridepublic Page createPage(String title, String author) {return new TablePage(title, author);}
}

测试类

package com.pc.abstractfactory.example.tablefactory.test;import com.pc.abstractfactory.example.factory.Factory;
import com.pc.abstractfactory.example.factory.Link;
import com.pc.abstractfactory.example.factory.Page;
import com.pc.abstractfactory.example.factory.Tray;
import org.junit.Test;/*** TableFactory Tester.** @author Switch* @version 1.0*/
public class TableFactoryTest {@Testpublic void testTableFactory() {Factory factory = Factory.getFactory("com.pc.abstractfactory.example.tablefactory.TableFactory");Link blog = factory.createLink("博客", "http://blog.csdn.net/q547550831");Link github = factory.createLink("Github", "http://www.github.com/Switch-vov");Tray mySite = factory.createTray("个人网站");mySite.add(blog);mySite.add(github);Link alibaba = factory.createLink("Alibaba", "http://www.alibaba.com");Link baidu = factory.createLink("Baidu", "http://www.baidu.com");Tray portal = factory.createTray("大型网站");portal.add(alibaba);portal.add(baidu);Page page = factory.createPage("网站介绍(表格版)", "Switch");page.add(mySite);page.add(portal);page.output();}
}

运行结果

控制台输出
网站介绍(表格版).html已编写完成。
E盘下网站介绍(表格版).html的内容
<html><head><title>网站介绍(表格版)</title>
<meta charset='utf-8'/>
</head>
<body>
<h1>网站介绍(表格版)</h1>
<table width='80%' border='3'>
<td><table width='100%' border='l'><tr><td bgcolor='#cccccc' align='center' colspan='2'><b>个人网站</b></td></tr>
<tr>
<td><a href='http://blog.csdn.net/q547550831'>博客</a></td><td><a href='http://www.github.com/Switch-vov'>Github</a></td></tr></table></td><td><table width='100%' border='l'><tr><td bgcolor='#cccccc' align='center' colspan='2'><b>大型网站</b></td></tr>
<tr>
<td><a href='http://www.alibaba.com'>Alibaba</a></td><td><a href='http://www.baidu.com'>Baidu</a></td></tr></table></td></table>
<hr/><address>Switch</address>
</body></html>
浏览器中运行结果

抽象工厂模式中的角色

AbstractProduct(抽象产品)

AbstractProduct角色负责定义AbstractProduct角色所生成的抽象零件和产品的接口(API)。在案例中,由Link类、Tray 类和Page类扮演此角色。

AbstractFactory(抽象工厂)

AbstractFactory角色负责定义用于生成抽象产品的接口( API)。在案例中,由Factory类扮演此角色。

Client(委托者)

Client角色仅会调用AbstractFactory角色和AbstractProduct角色的接口(API)来进行工作,对于具体的零件、产品和工厂一无所知。在案例中,由测试类扮演此角色。类图中省略了Client这一角色。

ConcreteProduct(具体产品)

ConcreteProduct角色负责实现AbstractProduct角色的接口(API)。在案例中,由以下包中的以下类扮演此角色。

  • listfactory包:ListLink类、ListTray类和ListPage
  • tablefactory包:TableLink类、TableTray类和TablePage

ConcreteFactory(具体工厂)

ConcreteFactory角色负责实现AbstractFactory角色的接口(API)。在案例中,由以下包中的以下类扮演此角色。

  • listfactory包:ListFactory
  • tablefactory包:TableFactory

类图

GitHub:DesignPatternStudy

——————参考《图解设计模式》

设计模式学习笔记——抽象工厂(Abstract Factory)模式相关推荐

  1. 设计模式--抽象工厂(Abstract Factory)模式

    模式定义 提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类 类图 应用场景 程序需要处理不同系列的相关产品,但是你不希望它依赖于这些产品的具体类时可以使用抽象工厂模式 优点 1.可以 ...

  2. [设计模式-创建型]抽象工厂(Abstract Factory)

    概括 名称 Abstract Factory 结构 动机 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个 ...

  3. 《研磨设计模式》chap7 抽象工厂 Abstract Factory

    场景:配电脑,多种CPU.主板 1. 正常编码 1.1 cpu //CPU的接口 public interface CPUApi {//示意方法,CPU具有运算的功能 public void calc ...

  4. java/android 设计模式学习笔记(8)---桥接模式

    这篇博客我们来介绍一下桥接模式(Bridge Pattern),它也是结构型设计模式之一.桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯或者使用,桥接模式的作用就是为被分离了的抽象部分 ...

  5. 设计模式之笔记--抽象工厂模式(Abstract Factory)

    抽象工厂模式(Abstract Factory) 定义 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 类图 描述 多个抽象产品 ...

  6. c++设计模式--抽象工厂(abstract factory)

    一.原理讲解 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 1.1意图 定义一个创建对象的接口,让子类决定实例化哪个类.该模式使类对象的创建延迟到子类. 1.2应用场景 一个 ...

  7. 设计模式 抽象工厂(Abstract Factory Pattern)

    抽象工厂模式,比工厂模式具有更高层次的抽象.当要返回一系列相关类中的某一个,而每个类都能根据需要返回不同的对象时,可以使用这种模式.换句话说,抽象工厂是一个工厂对象,他能返回一系列相关类中的一个类.可 ...

  8. 设计模式读书笔记-----抽象工厂模式

    在工厂方法模式中,我们使用一个工厂创建一个产品,也就是说一个具体的工厂对应一个具体的产品.但是有时候我们需要一个工厂能够提供多个产品对象,而不是单一的对象,这个时候我们就需要使用抽象工厂模式. 在讲解 ...

  9. 设计模式学习笔记(十一)-组合模式

    树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得 ...

最新文章

  1. 因0x764fb11c的错误状态_《最强大脑》国际赛王易木又被质疑作弊,因背反答案露出了马脚?...
  2. 【云和恩墨大讲堂】Oracle线上嘉年华第二讲
  3. SWTBOK測试实践系列(1) -- 測试在项眼下期的评审投入划算吗?
  4. c标准基本库函数:libc、glibc的关系
  5. 基于京东手机销售数据用回归决策树预测价格
  6. 一张大图片有多个小图片
  7. 【Tyvj - 1305】最大子序和(单调队列优化dp)
  8. SharePoint 2013 Reporting Service 部署配置图文教程
  9. Android日志系统Logcat源代码简要分析
  10. oracle alter database close,alter database close
  11. python百度贴吧发帖签到_百度贴吧签到脚本
  12. c语言中优先级顺序表
  13. 什么是万物互联(IoE)?与物联网(IoT)的区别是什么?
  14. 获取当前北京时间API
  15. python库源码分析_python第三方库Faker源码解读
  16. 3D游戏编程大师技巧读书笔记(第一章)
  17. php重载求圆锥体积,编写一函数文件,实现求一个圆锥体的体积。
  18. [转]体育运动比赛英语
  19. matlab 图中lengend换行
  20. [TOG2021](DECA)Learning an Animatable Detailed 3D Face Model from In-The-Wild Images

热门文章

  1. CCNA初认识——ACL命令
  2. JavaScript异步编程【上】 -- 同步和异步、事件循环(EventLoop)、微任务和宏任务、回调函数
  3. 【Python】科赫雪花绘制
  4. firebase连接不上_如何在Firebase上托管Blazor应用程序
  5. 我从机器人先生那里了解到了有关InfoSec的全部信息
  6. 技术交流论坛_天气预报|“第一届国家建筑工程与材料测试技术论坛”暨“第七届全国建筑材料测试技术”交流会...
  7. markdown入门4--矩阵空格公式方程组
  8. 学以致用,Python定时采集微博评论
  9. 大数据和人工智能时代下的运筹学
  10. DataGridView DataGridViewCheckBoxColumn编辑时实时触发事件