Java设计模式(3)——抽象工厂模式
抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。
一、产品族和产品等级结构
为了方便引进抽象工厂模式,特地引进一个新的概念:产品族(Product Family)。所谓产品族,是指位于不同产品等级结构中,功能相关联的产品组成的家族。每一个产品族中含有产品的数目,与产品等级结构的数目是相等的。产品的等级结构和产品族将产品按照不同方向划分,形成一个二维的坐标系。即相图:

在上面的相图中加入了具体工厂角色。可以看出,对应于每一个产品族都有一个具体的工厂。而每一个工厂负责创建属于同一个产品族,但是分属不同的等级机构的产品。
二、模式中包含的角色及其职责
1.抽象工厂(Creator)角色
  抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
2.具体工厂( Concrete  Creator)角色
  具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
3.抽象(Product)角色
  抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
4.具体产品(Concrete Product)角色
  抽象模式所创建的具体实例对象
总结:抽象工厂中方法对应产品结构,具体工厂对应产品族。
三、Demo
抽象角色
产品结构(Apple、Banana)
public interface Fruit {
    /*
     * 采集
     */
    public void get();
}
public abstract class Apple implements Fruit{
    /*
     * 采集
     */
    public abstract void get();
}
public abstract class Banana implements Fruit{
    /*
     * 采集
     */
    public abstract void get();
}
具体产品角色
产品族(北方水果)
public class NorthApple extends Apple {
    public void get() {
        System.out.println("采集北方苹果");
    }
}
public class NorthBanana extends Banana {
    public void get() {
        System.out.println("采集北方香蕉");
    }
}
产品族(南方水果)
public class SouthApple extends Apple {
    public void get() {
        System.out.println("采集南方苹果");
    }
}
public class SouthBanana extends Banana {
    public void get() {
        System.out.println("采集南方香蕉");
    }
}
抽象工厂角色
public interface FruitFactory {
    //实例化Apple
    public Fruit getApple();
    //实例化Banana
    public Fruit getBanana();
}
具体工厂角色
public class NorthFruitFactory implements FruitFactory {
    public Fruit getApple() {
        return new NorthApple();
    }
    public Fruit getBanana() {
        return new NorthBanana();
    }
}
public class SouthFruitFactory implements FruitFactory {
    public Fruit getApple() {
        return new SouthApple();
    }
    public Fruit getBanana() {
        return new SouthBanana();
    }
}
测试类
public class MainClass {
    public static void main(String[] args) {
        FruitFactory ff = new NorthFruitFactory();
        Fruit apple = ff.getApple();
        apple.get();
        Fruit banana = ff.getBanana();
        banana.get();
        FruitFactory ff2= new SouthFruitFactory();
        Fruit apple2 = ff2.getApple();
        apple2.get();
        Fruit banana2 = ff2.getBanana();
        banana2.get();
    }
}
控制台输出
采集北方苹果
采集北方香蕉
采集南方苹果
采集南方香蕉
四、UML类图

Java设计模式(3)——抽象工厂模式的更多相关文章
- Java 设计模式之抽象工厂模式(三)
		原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ... 
- 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 设计模式之抽象工厂模式
		抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ... 
- [java] java 设计模式(2):抽象工厂模式(Abstract Factory)
		工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这 ... 
- java设计模式之抽象工厂模式学习
		工厂模式有个问题就是,类的创建依赖工厂.要想增加一个工厂类,就要修改原来的代码,这违背了闭包原则.所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的 ... 
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
		Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ... 
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
		原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ... 
随机推荐
- Hibernate学习5—Hibernate操作对象2
			第二节:Session 常用方法讲解 2)load和get()方法: 数据库中不存在与OID 对应的记录,Load()方法会抛出异常: load方法默认采用延迟加载,load出来的对象是一个代理类.开 ... 
- appium+python自动化32-android_uiautomator定位进阶版
			前言 上一篇介绍uiautomator的定位方式都是类似这种'new UiSelector().xxx("xxx")',看起非常长,我也记不住,这很不python.于是本篇优化了定 ... 
- mysql 数据库 自动截取数据的问题---mysql的sql_model的四种模式:宽松模式、严格模式
			mysql支持的sql_mode模式:ANSI.TRADITIONAL.STRICT_ALL_TABLES和STRICT_TRANS_TABLES. ANSI模式:宽松模式,对插入数据进行校验,如果不 ... 
- vue-router规则下 history模式在iis服务器上配置
			vue默认模式是hash模式 url地址栏会带有“#”这个字符. 例如:http://www.xxx.com/#/index 感觉和正常的url相比有点丑. 如何让此地址如正常的url一样 官 ... 
- 《Hadoop技术内幕》读书笔记——Task运行过程分析
			本文是董西成的Hadoop技术内幕一书的读书章节总结. 第八章 Task运行过程分析 所有Task需要周期性地向TaskTracker汇报最新进度和计数器值,而这正是由Reporter组件实现的,其中 ... 
- windows zabbix_agent 客户端安装部署
			1.下载客户端:zabbix_agentd.zip 2.在c盘创建文件夹zabbix,解压conf和bin目录 3.将conf下的zabbix_agentd.win.conf 修改为zabbix_ag ... 
- cocos2dx 3.6版本播放动画
			IDE: VS2013 版本:cocos2dx 3.3.6 语言:c++ 11 3.x版本改动与2.x版本相比改动很大,几个比较明显的点就是所有带cc的前缀没有了,然后一些获取类型的函数名称加了get ... 
- Django学习---路由url,视图,模板,orm操作
			Django请求周期 url -> 路由系统 ->函数或者类 -> 返回字符串 或者 模板语言 Form表单提交: 点击提交 -> 进入url系统 -> 执行函数 ... 
- 关于OpenGL Framebuffer Object、glReadPixels与离屏渲染
			最近写论文需要用到离屏渲染(主要是因为模型太大普通窗口绘制根本做不了),于是翻阅了红宝书查了下相关api和用法.中文版的红宝书可读性有点差,很多地方翻译地晦涩,但好歹读起来比较快,主要相关章节为第8章 ... 
- SWFUpload初体验 For Struts1.x
			SWFUpload是一个客户端文件上传工具,最初由Vinterwebb.se开发,它通过整合Flash与JavaScript技术为WEB开发者提供了一个具有丰富功能继而超越传统<input ty ... 
