博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式(十三)抽象工厂模式
阅读量:6850 次
发布时间:2019-06-26

本文共 3072 字,大约阅读时间需要 10 分钟。

相关文章

前言

此前讲解过简单工厂模式和工厂模式,这一篇我们来学习工厂系列的最后一个模式抽象工厂模式,建议在阅读此文前,请先阅读、这两篇文章。

1.抽象工厂模式定义

抽象工厂模式可以说是是工厂方法模式的升级版,当需要创建的产品有多个产品线(产品族)时使用抽象工厂模式是比较好的选择。那什么是多个产品线呢?拿我们在、中学习的生产电脑的例子来举例,我们一直都是生产联想和惠普的电脑,但是电脑也有多个产品线:台式机、笔记本和平板等等,联想和惠普都在生产这些不同产品线上的电脑,使用工厂方法模式已经满足不了需求,这一篇文章我们就用抽象工厂模式来解决这一问题。

抽象工厂模式定义

为创建一组相关或者相互依赖的对象提供一个接口,而无需指定它们的具体类。

抽象工厂模式UML图

在抽象工厂模式中有如下角色:

  • AbstractFactory:抽象工厂,它声明了用来创建不同产品的方法。
  • ConcreteFactory:具体工厂,实现抽象工厂中定义的创建产品的方法。
  • AbstractProduct:抽象产品,为每种产品声明业务方法。比如上图的AbstractProductA和 AbstractProductB。
  • ConcreteProduct:具体产品,定义具体工厂生产的具体产品,并实现抽象产品中定义的业务方法。

2.抽象工厂模式简单实现

联想和惠普生产的电脑分为了两个产品线,一个台式机,一个是笔记本。为了解决增加产品线的问题,我们用抽象工厂模式来进行实现。

抽象产品

首先定义抽象产品类:

public abstract class DesktopComputer {  public abstract void start();}public abstract class NotebookComputer {   public abstract void start();}复制代码

两个抽象产品类分别为DesktopComputer和NotebookComputer ,用来定义两个产品线:台式机和笔记本。它们都定义了start方法,用来启动电脑。

具体产品
具体产品为联想和惠普旗下的台式机和笔记本,如下所示。

public class LenovoDesktopComputer extends DesktopComputer {    @Override    public void start() {        System.out.println("联想台式电脑启动");    }}public class HpDesktopComputer extends DesktopComputer {    @Override    public void start() {        System.out.println("惠普台式电脑启动");    }}public class LenovoNotebookComputer extends NotebookComputer {    @Override    public void start() {        System.out.println("联想笔记本电脑启动");    }}public class HpNotebookComputer extends NotebookComputer {    @Override    public void start() {        System.out.println("惠普笔记本电脑启动");    }}复制代码

抽象工厂

接着创建生产电脑的抽象工厂,如下所示,

public abstract class ComputerFactory {    public abstract DesktopComputer createDesktopComputer();    public abstract NotebookComputer createNotebookComputer();}复制代码

定义了两个方法,分别用来生产台式电脑和笔记本电脑。

具体工厂

定义联想和惠普工厂:

public class LenovoFactory extends ComputerFactory {    @Override    public DesktopComputer createDesktopComputer() {        return new LenovoDesktopComputer();    }    @Override    public NotebookComputer createNotebookComputer() {        return new LenovoNotebookComputer();    }}public class HpFactory extends ComputerFactory {    @Override    public DesktopComputer createDesktopComputer() {        return new HpDesktopComputer();    }    @Override    public NotebookComputer createNotebookComputer() {        return new HpNotebookComputer();    }}复制代码

联想工厂和惠普工厂用来生产台式机和笔记本这两个不同产品线的电脑。

客户端调用

最后编写客户端:

public class Client {    public static void main(String[]args) {        ComputerFactory lenocoFactory=new LenovoFactory();        lenocoFactory.createDesktopComputer().start();        lenocoFactory.createNotebookComputer().start();        ComputerFactory hpFactory=new HpFactory();        hpFactory.createDesktopComputer().start();        hpFactory.createNotebookComputer().start();    }}复制代码

分别用LenovoFactory和HpFactory生产台式和笔记本电脑,并调用start方法启动它们。

运行结果为:
联想台式电脑启动
联想笔记本电脑启动
惠普台式电脑启动
惠普笔记本电脑启动

接下来给出这个例子的UML图,更便于理解,如下所示。

3.抽象工厂模式的优缺点

优点

具体类的创建实例过程与客户端分离,客户端通过工厂的抽象接口操纵实例,客户端并不知道具体的实现是谁。

缺点

如果增加新的产品族则也需要修改抽象工厂和所有的具体工厂。

抽象工厂模式的使用场景

  • 一个系统不依赖于产品线实例如何被创建、组合和表达的细节。
  • 系统中有多于一个的产品线,而每次只使用其中某一产品线。
  • 一个产品线(或是一组没有任何关系的对象)拥有相同的约束。

参考资料

《大话设计模式》
《设计模式之禅》
《Android源码设计模式》

转载地址:http://jgrul.baihongyu.com/

你可能感兴趣的文章
pdb文件是什么
查看>>
.Net 跳转
查看>>
vim搭建笔记
查看>>
人要有畏惧之心
查看>>
SpringCloud学习笔记(4)——Zuul
查看>>
mysql主从备份及原理分析
查看>>
Docker 入门 --- 命令总结
查看>>
MySQL 批量写入数据报错:mysql_query:Lost connection to MySQL server during query
查看>>
【spring boot】spring boot中使用@RestController不起作用,不返回json,依旧去找访问接口的请求地址对应的页面...
查看>>
简约响应式布局样式
查看>>
iOS平台XML解析类库对比和安装说明
查看>>
各种纪念-好久没更新了
查看>>
渴望出差
查看>>
非常酷的国外网站导航设计案例欣赏
查看>>
xp sp3+iis 服务器不可用
查看>>
【windows phone】控件1
查看>>
使用curl抓取网页遇到HTTP跳转时得到多个HTTP头部的问题
查看>>
JQuery学习笔记
查看>>
UITextField的详细使用
查看>>
oracle触发器select into和cursor用法的区别
查看>>