java设计模式-----3、抽象工厂模式
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
产品族
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 {
@Override
public void get() {
System.out.println("采集北方苹果");
}
}
南方苹果
public class SouthApple extends Apple{
@Override
public void get() {
System.out.println("采集南方苹果");
}
}
北方香蕉
public class NorthBanana extends Banana {
@Override
public void get() {
System.out.println("采集北方香蕉");
}
}
南方香蕉
public class SouthBanana extends Banana {
@Override
public void get() {
System.out.println("采集南方香蕉");
}
}
接下来创建工厂,而每一个产品族都对应一个具体的工厂,每个产品族都包含苹果和香蕉,所以每个工厂中都包含苹果和香蕉
抽象工厂
public interface FruitFactory {
//实例化一个苹果
public Fruit getApple();
//实例化一个香蕉
public Fruit getBanana();
}
public class NorthFactory implements FruitFactory{
@Override
public Fruit getApple() {
return new NorthApple();
}
@Override
public Fruit getBanana() {
return new NorthBanana();
}
}
public class SouthFactory implements FruitFactory{
@Override
public Fruit getApple() {
return new SouthApple();
}
@Override
public Fruit getBanana() {
return new SouthBanana();
}
}
最后,写一个运行的主方法
public class MainClass {
public static void main(String[] args) {
FruitFactory nf = new NorthFactory();
Fruit nApple = nf.getApple();
nApple.get();
Fruit nBanana = nf.getBanana();
nBanana.get();
FruitFactory sf = new SouthFactory();
Fruit sApple = sf.getApple();
sApple.get();
Fruit sBanana = sf.getBanana();
sBanana.get();
}
}
采集北方苹果
采集北方香蕉
采集南方苹果
采集南方香蕉
这时如果想新增一个产品族热带水果,只需新建一个热带产品族的工厂即可,已经建好的南方与北方工厂无需改动,也符合开放-封闭原则。
但缺点也很明显,从产品等级来看,如果想新增一个产品等级,例如上面的例子只有苹果与香蕉,如果现在新增一个葡萄,就需要在抽象工厂中添加一个葡萄抽象方法,再在每一个具体工厂中实现此方法。这样就完全不符合开放-封闭原则了。
抽象工厂模式中包含的角色及其职责
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设计模式(3)——抽象工厂模式
抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象. 一.产品族和产品等级结构 为 ...
- java设计模式之抽象工厂模式学习
工厂模式有个问题就是,类的创建依赖工厂.要想增加一个工厂类,就要修改原来的代码,这违背了闭包原则.所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的 ...
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...
随机推荐
- PHP 函数功能参考
basename() 返回路径中的文件名部分 chgrp() 改变文件组 chmod() 改变文件模式 chown() 改变文件所有者 clearstatcache() 清除文件状态缓存 copy() ...
- git 命令摘录
回滚 n 个 commit (增加了revert commit) git revert -n commit_id 回滚到指定的commit_id(不增加commit,回滚的commit_id被删除) ...
- C#-WebForm-AJAX阿贾克斯(一)基础知识
AJAX 即“ Asynchronous Javascript And XML ”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异步 JavaScri ...
- knova绘制进度条
效果: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- Ubuntu16.04安装视觉SLAM环境(g2o)
1.首先在github上下载g2o图优化库 git clone https://github.com/RainerKuemmerle/g2o.git 2.运行安装以下依赖库 sudo apt-get ...
- 【性能测试】脚本开发,最普通的http协议脚本
放上来做个备份: Action() { double transTime; // 事务消耗时间 lr_start_transaction("营销_01_MSMH0011_查询拥有码列表&qu ...
- win7 免安装MariaDB
1. 官网下载MariaDB的windows版本 地址:https://downloads.mariadb.org/mariadb/10.0.17/ 目前最新版本是10.0.17 2. 下载完成后 ...
- spring boot快速入门 3: controller的使用
模版引擎的使用: 第一步:在POM文件添加配置 <!-- 模版引擎 --> <dependency> <groupId>org.springframework.bo ...
- java回调方法之理解
以前经常看见"回调方法(或回调函数)"一词,但是没有了解过是什么意思,更不知道用法.现在从网络上搜集了一些很好的资料,自己又整理一下,作为自己的笔记,也作为学习过程中的一个小脚印. ...
- docker最新版本如何自定义配置文件
1 如果你想使用 /etc/default/docker文件配置你的docker 在 /etc/systemd/system/docker.service.d/docker.conf 添加下面---- ...