抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

主要解决:主要解决接口选择的问题。

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

如何解决:在一个产品族里面,定义多个产品。

关键代码:在一个工厂里聚合多个同类产品。

应用实例:下面例子中鼠标,键盘,耳麦为产品,惠普,戴尔为工厂,抽象工厂模式也就是不仅生产鼠标,同时生产键盘。也就是 PC 厂商是个父类,有生产鼠标,生产键盘两个接口。戴尔工厂,惠普工厂继承它,

     可以分别生产戴尔鼠标+戴尔键盘,和惠普鼠标+惠普键盘。创建工厂时,由戴尔工厂创建。后续工厂.生产鼠标()则生产戴尔鼠标,工厂.生产键盘()则生产戴尔键盘。

以下是具体实现代码,首先是代码结构图:

import cn.review.day03.abstractfactory.product.Keboy;
import cn.review.day03.abstractfactory.product.Mouse; /**
* PC厂商工厂抽象类
* @author dyq
*
*/
public abstract class PcFactory {
public abstract Mouse createMouse();
public abstract Keboy createKeboy();
}
import cn.review.day03.abstractfactory.product.DellKeyboy;
import cn.review.day03.abstractfactory.product.DellMouse;
import cn.review.day03.abstractfactory.product.Keboy;
import cn.review.day03.abstractfactory.product.Mouse;
/**
* 戴尔生产工厂
* @author dyq
*
*/
public class DellFactory extends PcFactory{ @Override
public Mouse createMouse() {
return new DellMouse();
} @Override
public Keboy createKeboy() {
return new DellKeyboy();
} }
import cn.review.day03.abstractfactory.product.HpKeboy;
import cn.review.day03.abstractfactory.product.HpMouse;
import cn.review.day03.abstractfactory.product.Keboy;
import cn.review.day03.abstractfactory.product.Mouse;
/**
* 惠普生产工厂
* @author dyq
*
*/
public class HpFactory extends PcFactory{
@Override
public Mouse createMouse() {
return new HpMouse();
}
@Override
public Keboy createKeboy() {
return new HpKeboy();
} }
/**
* 生成工厂器类,通过不同的厂家来获取不同的生产工厂
* @author dyq
*
*/
public class FactoryProducer {
public static PcFactory getFactory(String choice){
if(choice.equalsIgnoreCase("DELL")){
return new DellFactory();
} else if(choice.equalsIgnoreCase("HP")){
return new HpFactory();
}
return null;
}
}
/**
* 产品之鼠标接口
* @author dyq
*
*/
public interface Mouse {
public String sayHi();
}
/**
* 产品之键盘接口
* @author dyq
*
*/
public interface Keboy {
public String sayHi();
}
/**
* 戴尔键盘生产类
* @author dyq
*
*/
public class DellKeyboy implements Keboy{
@Override
public String sayHi() {
return "生产了戴尔键盘";
} }
/**
* 戴尔鼠标生产类
* @author dyq
*
*/
public class DellMouse implements Mouse{ @Override
public String sayHi() {
return "生产了戴尔鼠标";
} }
/**
*
* @author dyq
*
*/
public class HpKeboy implements Keboy{ @Override
public String sayHi() {
return "生产了惠普键盘";
} }
public class HpMouse implements Mouse{

    @Override
public String sayHi() {
return "生产了惠普鼠标";
} }

最后是测试类:

import cn.review.day03.abstractfactory.factory.FactoryProducer;
import cn.review.day03.abstractfactory.factory.PcFactory;
import cn.review.day03.abstractfactory.product.Mouse;
/**
* 测试抽象工厂模式
* @author dyq
*
*/
public class DesignPatternAbstractFactory {
public static void main(String[] args) {
PcFactory dellPcFactory = FactoryProducer.getFactory("DELL");
Mouse dellMouse = dellPcFactory.createMouse();
String mouse1 = dellMouse.sayHi();
System.out.println(mouse1); PcFactory hpPcFactory = FactoryProducer.getFactory("HP");
Mouse hpMouse = hpPcFactory.createMouse();
String mouse2 = hpMouse.sayHi();
System.out.println(mouse2);
}
}

在抽象工厂模式中,假设我们需要增加一个产品

假设我们增加耳麦这个产品,则首先我们需要增加耳麦这个父类,再加上戴尔耳麦,惠普耳麦这两个子类。

之后在PC厂商这个父类中,增加生产耳麦的接口。最后在戴尔工厂,惠普工厂这两个类中,分别实现生产戴尔耳麦,惠普耳麦的功能。

JAVA常用设计模式(一、抽象工厂模式)的更多相关文章

  1. java常用设计模式二:工厂模式

    1.简单工厂模式(静态工厂方法模式) 抽象实例: public interface People { void talk(); } 具体实例: public class Doctor implemen ...

  2. Java 设计模式之抽象工厂模式(三)

    原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...

  3. 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式

    桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...

  4. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  5. java设计模式之抽象工厂模式

    上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...

  6. Java设计模式系列-抽象工厂模式

    原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...

  7. java设计模式(三)--抽象工厂模式

    转载:http://zz563143188.iteye.com/blog/1847029 前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式. 工厂方法模式有一个问题就是,类的 ...

  8. 设计模式之抽象工厂模式(Java实现)

    “上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说完,摸了摸跪的发疼的膝盖,咳咳,我发四我没笑!真 ...

  9. Java 设计模式之抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...

  10. [java] java 设计模式(2):抽象工厂模式(Abstract Factory)

    工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这 ...

随机推荐

  1. Python paramiko 修改源码实现用户命令抓取

    paramiko 源码修改 paramiko主要用来实现ssh客户端.服务端链接,上一节我们说到了堡垒机,堡垒机内有一个需求是“用户行为审计”,在这里我们就可以通过修改paramiko内文件的源码来实 ...

  2. 极路由hosts

    cat /etc/hosts 127.0.0.1 localhost tw-vars hiwifi 192.168.199.1 t.w tw t 4006024680.com www.40060246 ...

  3. UI自动化(四)css样式

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. freeswitch设置支持视频语音编码

    1.修改FreeSWITCH安装路径下/conf/var.xml文件中,增加: <X-PRE-PROCESS cmd=="set" data="proxy_medi ...

  5. luoguP1281 书的复制 DP,贪心

    luoguP1281 书的复制 链接 https://www.luogu.org/problemnew/show/P1281 思路 简单dp,输出方案. 很明显dp记录路径对不对? 恭喜你死了. 求出 ...

  6. 代码覆盖率-JaCoCo

    代码覆盖率 在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或 90%. JaCoCo Jacoco从多种角度对代码 ...

  7. python 获取文件目录位置

    test.py import os print('***获取当前目录***') print(os.getcwd()) print(os.path.abspath(os.path.dirname(__f ...

  8. App自动更新(DownloadManager下载器)

    一.开门见山 代码: object AppUpdateManager { const val APP_UPDATE_APK = "update.apk" private var b ...

  9. gulp点滴

    var gulp = require('gulp'), connect = require('gulp-connect'), browserify = require('gulp-browserify ...

  10. shell脚本中if

    [[ $i =~ ^[0-9]+$ ]] && echo 1 的解释 =~ 表示的是匹配 && 是前一个命令为真 才执行后一个命令 [[ ]] 是if判断使用正则表达式 ...