JAVA常用设计模式(一、抽象工厂模式)
抽象工厂模式
抽象工厂模式(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常用设计模式(一、抽象工厂模式)的更多相关文章
- java常用设计模式二:工厂模式
1.简单工厂模式(静态工厂方法模式) 抽象实例: public interface People { void talk(); } 具体实例: public class Doctor implemen ...
- Java 设计模式之抽象工厂模式(三)
原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...
- 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式
桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...
- java设计模式之抽象工厂模式
上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...
- Java设计模式系列-抽象工厂模式
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...
- java设计模式(三)--抽象工厂模式
转载:http://zz563143188.iteye.com/blog/1847029 前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式. 工厂方法模式有一个问题就是,类的 ...
- 设计模式之抽象工厂模式(Java实现)
“上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说完,摸了摸跪的发疼的膝盖,咳咳,我发四我没笑!真 ...
- Java 设计模式之抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...
- [java] java 设计模式(2):抽象工厂模式(Abstract Factory)
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这 ...
随机推荐
- Mac OS X 清除DNS缓存
参考: Flushing your DNS cache in Mac OS X and Linux Mac OS X 清除DNS缓存 根据Mac OS X操作系统的版本选择以下命令: Mac OS X ...
- Lintcode481-Binary Tree Leaf Sum-Easy
481. Binary Tree Leaf Sum Given a binary tree, calculate the sum of leaves. Example Example 1: Input ...
- [原][译][jsbsim]空气动力学模型库讨论JSBSim对比YASim
英文原文:JSBSim_vs_YASim 准确性和现实性飞行动力学模型的准确性和真实性是针对YASim的争论中提出的两个共同点.实际上,如果你给YASim或JSBSim垃圾参数,它们都将返回垃圾空气动 ...
- Java操作MongoDB:连接&增&删&改&查
1.连接 ①方式一 MongoClientOptions.Builder builder = MongoClientOptions.builder(); //可以通过builder做各种详细配置 Mo ...
- 第 8 章 容器网络 - 062 - 如何使用 flannel host-gw backend?
flannel host-gw backend flannel 支持多种 backend:(1)vxlan backend:(2)host-gw: 与 vxlan 不同,host-gw 不会封装数据包 ...
- three.js 第二篇:场景 相机 渲染器 物体之间的关系
w我用画画来形容他们之间的关系 场景就是纸张 相机就是我们的眼睛 物体就是在我们脑海中构思的那个画面 渲染器就是绘画这个动作 场景(Scene): 初始化:var scene = new THREE. ...
- spring El
package com.wisely.heighlight_spring4.ch2.el; import java.io.IOException; import org.apache.commons. ...
- 完整的Django入门指南学习笔记6
前言 欢迎来到系列教程的第六部分!在这篇教程中,我们将详细探讨基于类的视图(简称CBV).我们也将重构一些现有的视图,以便利用内置的基于类的通用视图(Generic Class-Based Views ...
- 【网址】.net/dot net可再发行组件下载哪家强
微软开发者文档中有篇文章包含了.net/dot net各版本下载全家福: https://msdn.microsoft.com/zh-cn/library/5a4x27ek.aspx 安全可靠.没有三 ...
- element-ui <el-input> 注册blur事件
<template> <div class="demo"> <el-input placeholder="注册blur事件" v- ...