抽象工厂模式_设计模式——抽象工厂模式

阅读目录

  • 使用频率:★★★★★
  • 一、什么是抽象工厂模式
  • 二、补充说明
  • 三、角色
  • 四、例子

使用频率:★★★★★

一、什么是抽象工厂模式

就是对一组具有相同主题的工厂进行封装(维基百科解释的很到位);

例如:生产一台PC机,使用工厂方法模式的话,一般会有cpu工厂,内存工厂,显卡工厂...但是使用抽象工厂模式的话,只有一个工厂就是PC工厂,但是一个PC工厂涵盖了cpu工厂,内存工厂,显卡工厂等要做的所有事;

二、补充说明

  • 注意这里的“相同主题”的概念,表示的是同一个产品族,不能将cpu工厂,面粉工厂封装成一个工厂,因为他们不属于同一个产品族;
  • 另外,还有一个产品等级的概念,还是以生产PC机为例,所谓的产品等级指的是不同厂商生产的CPU,如Intel和AMD的CPU,他们是同一个产品等级,如果只涉及产品等级的话,是不需要应用抽象工厂模式,使用工厂方法模式即可;
  • 工厂方法模式解决的范畴是产品等级(AMD处理器,Intel处理器等);抽象工厂模式解决的范畴是产品族等级(联想PC、惠普PC等);

三、角色

  • 抽象工厂
  • 具体工厂
  • 抽象产品
  • 具体产品
  • 产品使用者

说明:

  • 具体工厂“继承”抽象工厂;
  • 具体产品”继承“抽象产品;
  • 每个具体工厂(如PC工厂)包含若干个子工厂方法(如cpu工厂方法、显卡工厂方法...),子工厂方法负责生产对应的具体子产品,所有具体子产品(cpu、内存、显卡...)组合成一个具体产品(如惠普XXX型号PC);
  • 产品使用者使用每个具体工厂生产的具体产品;

四、例子

这里就不用PC这个例子了,继续前一个工厂模式的例子,在上一篇工厂模式的例子中,我们使用的是创建父亲对象这个例子,其中中国父亲和美国父亲指的就是同一个产品等级;

但是当我们要创建一个家庭对象的时候,需要创建父亲对象、母亲对象、孩子对象等等,所谓的父亲、母亲、孩子就构成了一个产品族,中国家庭、美国家庭就是产品族等级;这个时候就需要使用抽象工厂模式了;

类之间的关系图:

4e40bb0b5b079b45b7b713cd139d4d10.png
f8d2e357696e20e730cd7f9521a69371.gif

代码实现:

先创建抽象产品(抽象母亲、抽象父亲),具体产品(具体母亲、具体父亲):

package com.pichen.dp.creationalpattern.abstractfactory;public interface IMother {    public void printName();}
package com.pichen.dp.creationalpattern.abstractfactory;public interface IFather {    public void printName();}

package com.pichen.dp.creationalpattern.abstractfactory;public class ChineseMother implements IMother{    private String name;    public ChineseMother(String name) {        this.name = name;        System.out.println("create a cn mother.");    }    /**     * @return the name     */    public String getName() {        return name;    }    /**     * @param name the name to set     */    public void setName(String name) {        this.name = name;    }    @Override    public void printName() {        System.out.println(this.getClass().getName() + ":" + this.name);            }}

package com.pichen.dp.creationalpattern.abstractfactory;public class AmericanMother implements IMother{    private String name;    public AmericanMother(String name) {        this.name = name;        System.out.println("create a us mother.");    }    /**     * @return the name     */    public String getName() {        return name;    }    /**     * @param name the name to set     */    public void setName(String name) {        this.name = name;    }    @Override    public void printName() {        System.out.println(this.getClass().getName() + ":" + this.name);            }}

package com.pichen.dp.creationalpattern.abstractfactory;public class ChineseFather implements IFather{    private String name;    public ChineseFather(String name) {        this.name = name;        System.out.println("create a cn father.");    }    /**     * @return the name     */    public String getName() {        return name;    }    /**     * @param name the name to set     */    public void setName(String name) {        this.name = name;    }    @Override    public void printName() {        System.out.println(this.getClass().getName() + ":" + this.name);            }}

package com.pichen.dp.creationalpattern.abstractfactory;public class AmericanFather implements IFather{    private String name;    public AmericanFather(String name) {        this.name = name;        System.out.println("create a us father.");    }    /**     * @return the name     */    public String getName() {        return name;    }    /**     * @param name the name to set     */    public void setName(String name) {        this.name = name;    }    @Override    public void printName() {        System.out.println(this.getClass().getName() + ":" + this.name);            }}

创建一个抽象家庭工厂接口:

package com.pichen.dp.creationalpattern.abstractfactory;/** *  * abstract factory * father + mother + sister + ... = Product Family * cnfather + usfather + ukfather + ... = Product grade  //factory method * 〈功能详细描述〉 * @author    pi chen * @version   cp-lib V1.0.0, 2015年11月25日 * @see        * @since     cp-lib V1.0.0 */public interface IFamilyFactory {    public IFather createFather(String name);    public IMother createMother(String name);}

分别创建具体的中国家庭工厂和美国家庭工厂:

package com.pichen.dp.creationalpattern.abstractfactory;public class ChineseFamilyFactory implements IFamilyFactory{    @Override    public IFather createFather(String name) {        return new ChineseFather(name);    }    @Override    public IMother createMother(String name) {        return new ChineseMother(name);    }}

package com.pichen.dp.creationalpattern.abstractfactory;public class AmericanFamilyFactory implements IFamilyFactory{    @Override    public IFather createFather(String name) {        return new AmericanFather(name);    }    @Override    public IMother createMother(String name) {        return new AmericanMother(name);    }}

创面产品使用者main方法:

package com.pichen.dp.creationalpattern.abstractfactory;public class Main {    public static void main(String[] args) {        IFamilyFactory cnFamilyFactory = new ChineseFamilyFactory();        IFamilyFactory usFamilyFactory = new AmericanFamilyFactory();                IFather cnFather = cnFamilyFactory.createFather("cn father-test");        IMother cnMother = cnFamilyFactory.createMother("cn mother-test");                IFather usFather = usFamilyFactory.createFather("us father-test");        IMother usMother = usFamilyFactory.createMother("us mother-test");                cnFather.printName();        cnMother.printName();        usFather.printName();        usMother.printName();    }}

结果打印如下,功能正常:

create a cn father.
create a cn mother.
create a us father.
create a us mother.
com.pichen.dp.creationalpattern.abstractfactory.ChineseFather:cn father-test
com.pichen.dp.creationalpattern.abstractfactory.ChineseMother:cn mother-test
com.pichen.dp.creationalpattern.abstractfactory.AmericanFather:us father-test
com.pichen.dp.creationalpattern.abstractfactory.AmericanMother:us mother-test

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux启动和退出系统的方法,实验二 Linux的启动与关闭

实验二 Linux的启动与关闭一、实验目的(1)掌握linux操作系统正确的启动与关闭方法;(2)理解系统运行级的概念,掌握查看和设置的方法;(3)理解系统运行级服务的概念,掌握查看、开启和关闭的方法;(4)理解LILO和GRUB的原理&…

linux需要什么基础,学linux需要什么基础?

近几年来,随着计算机网络的发展,越来越多的人学习 linux。对于想要从事运维工作或者从事智能开发方面的同学来说,学习 linux 是必要的。linux 的学习并不简单,那么这篇文章 w3cschool 小编来告诉你,学 linux 需要什么基…

python arima模型_Python时间序列处理之ARIMA模型的使用讲解

ARIMA模型ARIMA模型的全称是自回归移动平均模型,是用来预测时间序列的一种常用的统计模型,一般记作ARIMA(p,d,q)。ARIMA的适应情况ARIMA模型相对来说比较简单易用。在应用ARIMA模型时,要保证以下几点:时间序列数据是相对稳定的&am…

windows(win7,win8,xp)hosts文件找不到原因分析及解决方法

2019独角兽企业重金招聘Python工程师标准>>> 一般情况hosts文件是保存在C:\windows\System32\Drivers\Etc 文件夹上,由于安装是win7系统,在这个路径上就能找到这个hosts文件。如果你在该路径下没有找到这个文件的话,一般是以下几种…

linux虚拟化cpu的绑定,为虚拟机vCPU绑定物理CPU

使用taskset命令将vCPU线程绑定到指定的物理CPU。例如,某虚拟机的qemu进程及两个vCPU线程如下: ​[rootkelvin ~]# ps -eLo ruser,pid,ppid,lwp,psr,args | grep qemu | grep -v greproot 4706 3629 4706 1 qemu-system-x86_64 -m 2G -smp 2 /var/lib/li…

sql 显示百分比_轻松搞定数据分析之SQL——简单查询

每天早起或者睡前听一首温柔而美好的音乐,是一件很幸福的事情,无论你是否懂音乐,它都能带你发现生活中的隐藏的那些美好,今天我们先来一起欣赏Mindy Gledhill的单曲《California》California (网易云音乐),每次我听到这首歌&#…

SpringMVC 中设置日期字符串转换格式

2019独角兽企业重金招聘Python工程师标准>>> 在使用SpringMVC的项目中经常遇到 controller 参数中接收Date类型的数据,但是页面传过来的参数又是日期字符串,会出现转换异常。 由于项目需要支持两种日期格式所以从写了一个日期转换器。网友可以…

操作系统 非连续分配_操作系统中的连续和非连续内存分配

操作系统 非连续分配In this article, we will learn about the different types of memory management techniques and also the pros and cons of different memory management techniques. 在本文中,我们将学习不同类型的内存管理技术 ,以及不同内存管…

文件名重定向到txt中Linux,Linux上glob用于实现文件名的通配、IO重定向及管道

Linux中所谓的通配是指,显示以指定条件为条件的文件;即通配的含义是指搜寻以已知条件为前提的目标文件。常用文件通配符有:文件通配符含义例子*任意长度的任意字符如a*,搜寻所有以a为首的文件名的文件?任意的单一字符如a&#xff…

分形与数据结构第二篇

一、分形之 迭代实现分形 本次的图形都是在之前的画图工具中实现的。 首先,还是和原来一样建立一个JButton元素组件,然后加上监听方法;再在public void mouseClicked(MouseEvent e) {}方法中实现图形; else if (s.equals("图…

python socket 大文件_python之socket运用之传输大文件

socket建议最大的传输单元是8192个字符,但是如果超过8192就会出现问题,我们可以用下面的方法处理客户端代码import subprocessimport socketip_bind ("127.0.0.1",9000)client socket.socket()client.connect(ip_bind)l1 []while True:opti…

华为linux版笔记本安装win7,华为MateBook X Pro笔记本怎样安装win7系统

华为MateBook X Pro的制造工艺达到了业界顶级的水准,高达91%的屏占比真正达到了近似全面屏的观感,触感顺滑质感强烈的机身让人爱不释手。对于有意选购一台高端轻薄本产品的消费者来说,MateBook X Pro应该是你首选的对象之一。那么这款笔记本怎…

横竖屏切换

单一控制器的横竖屏切换 if ([[UIDevice currentDevice] respondsToSelector:selector(setOrientation:)]) { SEL selector NSSelectorFromString("setOrientation:"); NSInvocation *invocation [NSInvocation invocationWithMethodSignature:[UIDevice instanceM…

怎么使用小爱同学音响_智能音响购买指南!!!

小度音响pro100天使用感受,100天前我冲动消费购买了一个智能音响,还是对比了多个智能音响做好的决定。使用到现在显然这个冲动消费是非常划算的,这个智能音响完全提升了我的生活质量,我现在一下班就会让它播放音乐、睡觉前播放几段…

达芬奇linux 与win,抛弃Linux:达芬奇软件WIN版安装及设置.doc

达芬奇软件Windows版本安装及设置指南注意事项:1. windows帐户名一定要是英文,否则安装过程中解压临时文件路径中有中文,安装会出错。如果帐户名是中文,需要在环境变量里面将用户环境变量的路径设为英文路径2. 这里我的安装路径都…

今天的几件琐事

最近发现突然忙了一些之后,很多事情都给耽误了,暂且称为拖延症吧。原本计划的很不错的学习计划,最近貌似也给耽误了不少,虽然每天回来会想今天写点什么,今天忙了些什么,发现好像今天的进步不大。因为离自己…

python做数学计算器_Python数学运算入门把Python当作计算器

Struts2 Interceptor学习Interceptor的设计思想,其实是Spring里面的AOP思想,尽管Struts2又有自己的Interceptor但是,在实际开发中,用的较少,SSH整合之后你可以采用AOP事务处理进行拦截,更 ...Mysql使用workbench迁移数据原文:http://jingyan.baidu.com/article/925f8cb8f3ec25c…

【分享】WeX5的正确打开方式(1)

最近在研究WeX5,想在这里记录下使用过程中的点滴,今天先把之前已经掌握的分享一下。WeX5官方的开发指南难度系数较大,面向的受众可能是已经敲过上万行代码的html5 app开发者。但是作为一个刚进入代码世界的html5 app开发宝宝,本人…

linux multipath.log,Linux Multipath配置

关于Linux Multipath配置,网上还是很多的,自己再来梳理一下,当前环境为RedHat6,HP P2000存储1. 安装软件。查看是否安装 rpm -qa |grep device-mapperdevice-mapper-multipath-libs-0.4.9-31.el6.x86_64device-mapper-event-libs-…

python文件封装成jar_【Python】Python文件打包为可执行文件

之前写的用于创建、链接Jenkins slave脚本是使用Python实现的,为了使未安装Python环境的伙伴也可以直接使用,故需要将其可直接执行的exe可执行文件。一、安装pyinsatller在cmd控制台输入以下命令进行安装。pip install pyinstaller二、使用pyinstaller打…