【http://www.360doc.com/content/11/0824/17/3034429_142983837.shtml】
这两天突然想学学java源代码,不过看到一篇文章说看java源代码要先看设计模式,这样更容易理解源代码的结构,所以就准备学学java设计模式,首先当然是看java创建模式的工厂模式了,刚开始直接看抽象工厂模式是什么意思,百度百科的实在是看不懂,后来又在网上看了看其他的文章,仔细思考后,还算是理解了,现在跟大家分享下。
首先说说简单工厂模式,我用现实中的汽车工厂举例子,首先有个汽车类的接口叫做Car,里面有个开车的方法叫做drive(),然后有个吉利车的类叫做Jili,实现了car的接口,还有个奇瑞车的类叫做Qirui,也实现了Car的接口(因为都是车嘛,当然能开了)。
interface Car{
public void drive(){
System.out.println("我开车");
}
class Jili implements Car{
public Jili(){
System.out.println("生产一台吉利车");
}
pulic void drive(){
System.out.println("我开吉利车");
}
}
class Qirui implements Car{
public Qirui(){
System.out.println("生产一台奇瑞车");
}
pulic void drive(){
System.out.println("我开奇瑞车");
}
}
那现在如果我要用Jili这个类,最基本的方式就是
Jili jili=new Jili();
如果用Qirui这个类,最基本的方式也是
Qirui qirui=new Qirui();
哦,那现在如果有个比亚迪车就得new Biyadi();然后同样有个drive()的方法,这样每个都得new个汽车对象,但是其实吉利,奇瑞和比亚迪他们都属于汽车,同样都有drive()方法,那是不是我们能创建一个生产汽车的工厂,然后你想要什么汽车只要告诉工厂就可以,工厂就帮你生产了,这样你不用管生产的细节工作(也就是new对象的过程),这样会更好呢,到此,简单工厂模式就出来了,简单工厂模式就是创建具有相同特征的类的实例,然后把创建汽车的方法静态化,这样就可以直接用工厂生产了,代码如下
class CarFactory{
public static Car createCar(String carname){
if("jili".equals(carname)){
return new Jili();
}else if("qirui".equals(carname)){
return new Qirui();
}else if("biyadi".equals(carname)){
return new Biyadi();
}
}
这就ok了,这样如果你要生产出一台汽车,直接调用Car car=CarFactory.createCar("jili");就可以了。
这种工厂虽然挺好,但是如果我每次要加入一个新车都得修改工厂类来加入新的判断语句,这样不符合开闭原则,所以慢慢人们又想出一种更加好的生产方式,这就是工厂方法模式。
首先我们把生产汽车的工厂类抽象出来当成一个接口,
Interface CarFactory{
public static Car createCar();
}
然后呢,让具体工厂类实现这个生产汽车的接口,这样就会有三个具体工厂,一个是吉利车生产工厂,一个是奇瑞车生产工厂,一个是比亚迪车生产工厂
class JiliFactory implements CarFactory{
public static Car createCar(){
return new Jili();
}
}
class QiruiFactory implements CarFactory{
public static Car createCar(){
return new Qirui();
}
}
class BiyadiFactory implements CarFactory{
public static Car createCar(){
return new Biyadi();
}
}
这样做的好处就是如果我还要生产一个长城汽车,不用去修改CarFactory这个工厂,只需要再写个长城工厂类去实现CarFactory这个接口就可以了。这就是工厂方法模式,不过工厂方法模式和简单工厂模式的各有优点,也不能就说工厂方法模式就好,关键在于看实际情况去决定用哪种模式。
随着社会的进步,汽车种类也多了,比如分为越野车和跑车两个系列,而工厂方法模式一般是针对于一种系列的抽象产品的生产,而把工厂方法模式进行扩充,变成可以对多种系列的产品进行生产,这就是抽象工厂模式了。
百度说抽象工厂模式是创建多个产品族的产品对象,那我在这解释下什么是产品族,现在我们还是以汽车工厂生产汽车为例,随着汽车行业的发展,汽车在应用上分为越野车和跑车,这样原来Car这个接口就不能通用,而变成了YueyeChe()和PaoChe()这两个接口,而越野车适合在山路上跑,跑车适合在赛路上跑,所有drive的方法也改变了,代码如下
interface YueyeChe(){
public driveShanlu();
}
interface PaoChe(){
public driveSailu();
}
而吉利和奇瑞也都生产跑车和越野车,这样大家就好理解了,跑车就是一个抽象产品族,越野车也是一个抽象产品族,而吉利跑车,吉利越野车,奇瑞跑车,奇瑞越野车是真正的类,这样我们还有四个类
public JiliPaoChe implements PaoChe{
public driveSailu(){
System.out.println("我在赛路开吉利跑车");
}
}
public QiruiPaoChe implements PaoChe{
public driveSailu(){
System.out.println("我在赛路开奇瑞跑车");
}
}
public JiliYueyeChe implements PaoChe{
public driveSailu(){
System.out.println("我在山路开吉利越野车");
}
}
public QiruiYueyeChe implements PaoChe{
public driveSailu(){
System.out.println("我在山路开奇瑞越野车");
}
}
车的接口和类就定义好了,相信大家也理解什么是产品族了,下面我们该看工厂怎么实现了,首先还是向工厂方法模式那样,有个生产汽车的工厂接口,不过我们对这个接口进行了一些扩充,因为Car类分成了跑车和越野车,所有我们接口也就是能生产出跑车和越野车这两种车型
Interface CarFactory{
public static PaoChe createPaoChe();
public static YueyeChe createYueyeChe();
}
和工厂方法一样我们需要两个真正的工厂类来生产真正的汽车,恩.....当然,吉利工厂可以生产吉利跑车和吉利越野车,奇瑞工厂可以生产奇瑞跑车和奇瑞越野车,代码如下
class JiliFactory implements CarFactory{
public static PaoChe createPaoChe(){
return new JiliPaoChe();
}
public static YueyeChe createYueyeChe(){
return new JiliYueyeChe();
}
}
class QiruiFactory implements CarFactory{
public static PaoChe createPaoChe(){
return new QiruiPaoChe();
}
public static YueyeChe createYueyeChe(){
return new QiruiYueyeChe();
}
}
ok了,抽象工厂模式也完成了,大家如果想生产一个吉利跑车,就可以JiliFactory.createPaoChe();这样吉利跑车就出来了,不错吧,同理如果我们还要一个比亚迪的汽车工厂只要实现CarFactory这个工厂就行了,代码如下
class BiyadiFactory implements CarFactory{
public static PaoChe createPaoChe(){
return new BiyadiPaoChe();
}
public static YueyeChe createYueyeChe(){
return new BiyadiYueyeChe();
}
}
相信大家应该理解了什么是抽象工厂模式,不过具体什么情况该如果选择哪种模式,还需要多多学习,才能融会贯通。
- Java工厂模式解耦 —— 理解Spring IOC
Java工厂模式解耦 -- 理解Spring IOC 最近看到一个很好的思想来理解Spring IOC,故记录下来. 资源获取方式 主动式:(要什么资源都自己创建) 被动式:(资源的获取不是我们创建, ...
- java工厂模式
(1)概念大白话:java工厂模式就是客户端(main函数)要创建对象觉得麻烦就让另外一个叫工厂的类帮它创建,然后自己每次要创建对象就叫工厂帮它弄,举个例子,在没有工厂这个"手下" ...
- Java工厂模式浅析理解
由于本人缺乏工作经验,本篇文章作为随笔,只是对工厂模式有一个简单的认识 工厂模式分为以下三种: 1:简单工厂(Simple Factory).2:工厂方法(Factory Method).3:抽象工厂 ...
- Java 工厂模式(一)— 简单工厂模式
一.什么是工厂模式: Java中的工厂模式主要是用来将有大量共同接口的类实例化.工厂模式可以动态的决定将哪一个类实例化,不必事先知道要实例化哪个类,将类的实例化的主动权交给工厂而不是类本身.我们常见的 ...
- java 工厂模式 转载
下面介绍三种设计模式,简单工厂模式,工厂方法模式,抽象工厂模式 思考如下场景: 有一天,林同学准备去买笔记本,他到商城发现有两款电脑他特别喜欢, 一款是 Macbook Pro, 另一款是 Surfa ...
- java工厂模式个人体会
上一边文章主要对单例模式做了一个总结,这篇文章主要对工厂模式也写一写个人的体会. 工厂模式是设计模式的一种,它主要是把实现产品对象的过程封装起来,然后提供给客户端相应的接口.工厂模式也是有3种,分别为 ...
- java 工厂模式 从无到有-到简单工厂模式-到工厂方法模式-抽象工厂模式
工厂模式定义(百度百科): 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工 ...
- Java学习笔记——Java工厂模式之简单工厂
package com.app; import java.util.Date; /* * 工厂模式:简单工厂.工厂方法.抽象工厂 * * */ public class Test0718_Factor ...
- JAVA - 工厂模式
1. 简单工厂违背OCP(Open Close Principle)原则 , 即对增加开放,对修改关闭.如果要符合OCP原则,要针对接口编程. //简单工厂模式,违反了OCP原则 public cla ...
随机推荐
- Glibc-2.3.4编译
$tar xf Glibc2.3.4.tar.bz2 $mkdir build_glibc $cd build_glibc ../glibc-2.3.4/configure --prefix=/too ...
- MySQL索引最左原则
通过实例理解单列索引.多列索引以及最左前缀原则 实例:现在我们想查出满足以下条件的用户id: 因为我们不想扫描整表,故考虑用索引. 单列索引: ALTER TABLE people ADD INDEX ...
- js的一些编码问题
1 eval()的使用; 未声明变量的使用: 遗漏的分号; 不恰当的换行; 错误的逗号使用; 语句周围遗漏的括号; switch分支语名中遗漏的break; 重复声明的变量; with的使用; 错误使 ...
- [javascript]jquery选择器笔记
技术文档 中文:http://jquery.cuishifeng.cn/ 英文:http://api.jquery.com/category/selectors/ 分类 基本选择器 层次选择器 过滤选 ...
- 安装VMware Tools:Ubuntu
1.首先准备好linux.iso,在安装目录下应该可以找到,我使用的是这个: 链接:http://pan.baidu.com/s/1nuGQyIt 密码:b5mn 2.打开Ubuntu,CD中加载该i ...
- jq中的$.post中方法
jQuery.post( url, [data], [callback], [type] ) : 使用POST方式来进行异步请求 参数: url (String) : 发送请求的URL地址. data ...
- 018——VUE中v-for操作对象与数值
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- HDU 4549 M斐波那契数列(矩阵快速幂+费马小定理)
M斐波那契数列 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submi ...
- canvas 画布 文字描边
总结一下,canvas 画布 文字描边的2种方法以及其不同的视觉效果: 效果图: 具体代码: <canvas id="canvas" width="800" ...
- 【前端工具】seajs打包部署工具spm的使用总结
相信使用seajs的好处大家都是知道的,接触seajs好像是在半年前,当时还不知道页面阻塞问题,这里不带多余的话了. seajs实现了模块化的开发,一个网站如果分了很多很多模块的话,等开发完成了,发现 ...