抽象工厂模式

抽象工厂模式(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. ps | grep排除grep这个进程

    我们经常用ps | grep xxx来查询是否存在某进程,但默认情况下会将grep这个命令也作为结果返回,这样无论是否存在查询的进程,该命令的返回值都是0. 要避免这种情况可以使用grep的-v参数, ...

  2. ERROR 1130 (HY000): Host '172.16.1.54' is not allowed to connect to this MySQL server

    centos7.5 远程连接数据库报错 问题: [root@db04-54 ~]# mysql -urep -p123 -h172.16.1.51 Warning: Using a password ...

  3. redis缓存服务器集群搭建

    一.安装redis 1.下载redis [root@redis ~]# wget http://download.redis.io/releases/redis-4.0.11.tar.gz 2.安装编 ...

  4. 5_bash

    bash及其特性:shell:外壳.用户直接接入计算机的时候所使用的外壳程序linux允许一个用户账户登录多次,而这多次登录的每一个打开的shell都是独立的互不相干的shell,它们是三个进程,每一 ...

  5. 基于虹软的Android的人脸识别SDK使用测试

    现在有很多人脸识别的技术我们可以拿来使用:但是个人认为还是离线端的SDK比较实用:所以个人一直在搜集人脸识别的SDK:原来使用开源的OpenCV:最近有个好友推荐虹软的ArcFace, 闲来无事就下来 ...

  6. [Vue]createElement参数

    一.createElement 函数模板 // @returns {VNode} createElement( // {String | Object | Function} // 一个 HTML 标 ...

  7. 想做AI测试,需要学习哪些数学知识?

    摘自知乎的回答 作者:者也 以上是个人读研以来感受用得最多的数学基础课,挂一漏万,大侠请补充指正 高等数学是基础中的基础,研究生以上级别的一切理工科都需要这个打底,数据挖掘.人工智能.模式识别此类跟数 ...

  8. ubuntu 16.04 的IP地址变更

    网上google 出来的,全是让你变更 /etc/network/interfaces 这个文件. 可是,我以前设置过的静态地址,全没反映在这个文件里. 这回再变更的话,肯定也不是这个. 然后进入/e ...

  9. [easyUI] 树形菜单 tree

    0.效果图 1. 一个id为mytree的无序列表 <h2>easy UI Tree</h2> <ul id="mytree"></ul& ...

  10. 版本控制工具Git的复杂用法的情境分析

    Git的版本库中的文件的三种状态 对于任何一个文件,在 Git 内都只有三种状态: 已提交(committed),已修改(modified)和已暂存(staged). 已提交表示该文件已经被安全地保存 ...