(@WhiteTaken)设计模式学习——抽象工厂模式
抽象工厂模式,可以向客户端提供一个接口,而客户端不用指定具体的类型创建对象,却能够创建多个产品族(一类具有共性产品,如地域等)的对象。
下面直接上代码。
1.苹果需要实现水果的接口,而苹果可以有北方的苹果,也可以有南方的苹果,所以也可以抽象成一个父类。
public interface Fruit {
public void Get();
} public abstract class Apple implements Fruit{
public abstract void Get();
}
2.南北方的苹果均需要继承这个父类,并实现父类的中的get方法。
public class NorthApple extends Apple {
public void Get() {
System.out.println("北方苹果");
}
} public class SouthApple extends Apple {
public void Get() {
System.out.println("南方苹果");
}
}
3.香蕉的做法与苹果类似,抽象的父类继承水果接口,假设南北方都有香蕉吧。
public abstract class Banana implements Fruit {
public abstract void Get() ;
} public class SouthBanana extends Banana {
public void Get() {
System.out.println("南方香蕉");
}
} public class NorthBanana extends Banana {
public void Get() {
System.out.println("北方香蕉");
}
}
4.这样创建的就都创建完成了。这时候我们考虑的问题,我们要想获得苹果的对象,或者获得香蕉的对象,应该有这样一个工厂去获得。但是苹果与香蕉是分南北的,所以我们需要南北工厂,这两个工厂就是“族”的概念。
这时候可以抽象出水果工厂的接口,接口中的方法分别是获取苹果对象,香蕉对象。
public interface FruitFactory {
public Fruit getApple();
public Fruit getBanana();
}
5.南北工厂需要实现这个接口。
public class SouthFruitFactory implements FruitFactory {
public Fruit getApple() {
return new SouthApple();
}
public Fruit getBanana() {
return new SouthBanana();
}
} public class NorthFruitFactory implements FruitFactory {
public Fruit getApple() {
return new NorthApple();
}
public Fruit getBanana() {
return new NorthBanana();
}
}
6.这样两个产品族就创建完成了,我们只需要在主客户端中创建南方的工厂,就可以通过调用getApple()方法,得到南方苹果的实例。其他亦然。
public class MainClass {
public static void main(String[] args) {
FruitFactory factory=new NorthFruitFactory(); //获取北方水果工厂的实例
Fruit apple=factory.getApple(); //北方苹果
Fruit banana=factory.getBanana(); //北方香蕉
apple.Get();
banana.Get(); FruitFactory factory2=new SouthFruitFactory(); //获取南方水果工厂的实例
Fruit apple2=factory2.getApple(); //南方苹果
Fruit banana2=factory2.getBanana(); //南方香蕉
apple2.Get();
banana2.Get();
}
}
个人理解,这个抽象工厂模式,在主客户端调用的时候,只需要获取相应的工厂,就可以得到想要的对象(不用指定具体要获取的对象),实现相应的方法。这里与最开始抽象工厂的方法结合着理解就ok。
(@WhiteTaken)设计模式学习——抽象工厂模式的更多相关文章
- 设计模式学习——抽象工厂模式(Abstract Factory Pattern)
现有一批装备(产品),分为不同的部位(上装.下装)与不同的等级(lv1.lv2).又有不同lv的工厂,只生产对应lv的全套装备. 代码实现上...本次写得比较偷懒,函数实现都写在头文件了.... 有些 ...
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...
- 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式
桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...
- Java 设计模式之抽象工厂模式(三)
原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...
- 再起航,我的学习笔记之JavaScript设计模式06(抽象工厂模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...
- 再起航,我的学习笔记之JavaScript设计模式07(抽象工厂模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...
- java设计模式之抽象工厂模式学习
工厂模式有个问题就是,类的创建依赖工厂.要想增加一个工厂类,就要修改原来的代码,这违背了闭包原则.所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的 ...
- Java-马士兵设计模式学习笔记-工厂模式-抽象工厂模式
一.概述 1.抽象工厂:当情况是需要产生一系列产品,若需更换产品,则要求一系列产品一起换,且要控制一系列产品的产生过程,此时可考虑抽象工厂模式.例:小明装修屋子,把电视.冰箱都替换掉,他这次需要把电视 ...
- C#设计模式之四抽象工厂模式(AbstractFactory)【创建型】
一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了 ...
随机推荐
- MODBUS协议详解
MODBUS是一个工业上通信常用的通讯协议,一般在PLC上面用的比较多,主要是定义了一种数据传输的规范,比如数据发给谁,数据是干嘛的,数据错没错,接收到数据的从机告诉我数据有没有接受到等. 传输的方式 ...
- iOS 添加导航按钮
iOS设置导航按钮navigationBar中包含了这几个重要组成部分:leftBarButtonItem, rightBarButtonItem, backBarButtonItem, title. ...
- IOS即时通讯XMPP搭建openfire服务器 分类: ios技术 2015-03-07 11:30 53人阅读 评论(0) 收藏
一.下载并安装openfire 1.到http://www.igniterealtime.org/downloads/index.jsp下载最新openfire for mac版 比如:Openfir ...
- iOS调试-LLDB学习总结
from:http://www.jianshu.com/p/d6a0a5e39b0e LLDB阐述 LLDB 是一个有着 REPL 的特性和 C++ ,Python 插件的开源调试器.LLDB 绑定在 ...
- UVa 374 - Big Mod
题目大意:计算R = BP mod M,根据模运算的性质计算. 正常计算会超时,可以用分治的思想降低时间复杂度.不过如果遇到00,结果...话说00的结果是1吗?忘了都... #include < ...
- Microsoft Visual 的变态
Microsoft Visual 里面使用指针 的时候, 声明要放在函数开始的位置,否则报错,真变态啊 刚刚发现,C的变量必须在语块开始声明,后面声明会报错,太不灵活了
- C语言-for循环
for循环是C语言中的循环语句之一,它的一般形式为for(初值,条件表达式,步长){语句};初值通常是一个赋值语句, 它用来给循环控制变量赋初值: 条件表达式是一个关系表达式, 它决定什么时候退出循环 ...
- 安卓 ArrayList,LinkedList,HashSet,Vector,TreeSet的区别和使用
java的集合就那么几种 总体为:List,Set,Map (都是接口由其子类去实现具体的方法) ArrayList,LinkedList,Vector都属于List List:元素是有顺序的,元素可 ...
- Jquery Validate 正则表达式实用验证代码常用的
jQuery.validate 的正则验证功能,包括手机号码.电话号码.邮政编码.QQ号码.IP地址.字母和数字.中文的验证等 手机号码验证 以下为引用内容: 代码如下: jQuery.validat ...
- PHP新手之学习类与对象(1)
本文介绍的是PHP程序设计语言中类和对象的基本知识,适合初学者阅读,希望对你有帮助,一起来看. PHP 5 引入了新的对象模型(Object Model).完全重写了 PHP 处理对象的方式,允许更佳 ...