【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 ...
随机推荐
- Restful Api CRUD 标准示例 (Swagger2+validator)
为什么要写这篇贴? 要写一个最简单的CRUD 符合 Restful Api 规范的 一个Controller, 想百度搜索一下 直接复制拷贝 简单修改一下 方法内代码. 然而, 搜索结果让我无 ...
- hdu 4857 逃生 拓扑排序+逆向建图
逃生 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Descr ...
- SSM配置Socket多线程编程(RFID签到实例)
1.SocketServiceLoader.java package cn.xydata.pharmacy.api.app.test; import javax.servlet.ServletCont ...
- HDU - 5988The 2016 ACM-ICPC Asia Qingdao Regional ContestG - Coding Contest 最小费用流
很巧妙的建边方式 题意:有n个区域,每个区域有一些人数si和食物bi,区域之间有m条定向路径,每条路径有人数通过上限ci.路径之间铺了电线,每当有人通过路径时有pi的概率会触碰到电线,但是第一个通过的 ...
- 4.彻底理解synchronized
1. synchronized简介 在学习知识前,我们先来看一个现象: public class SynchronizedDemo implements Runnable { private s ...
- UVA-1312 Cricket Field (技巧枚举)
题目大意:在一个w*h的网格中,有n个点,找出一个最大的正方形,使得正方形内部没有点. 题目分析:寻找正方形实质上等同于寻找矩形(只需令长宽同取较短的边长).那么枚举出所有可能的长宽组合取最优答案即可 ...
- 008PHP基础知识——运算符(一)
<?php /** * 运算符(一) */ /*PHP中的运算符: * 1.算术运算符: * 2.递增/递减运算符 * 3.比较运算符 * 4.逻辑运算符 * 5.位运算符 * 6.其他运算符 ...
- UML类图几种关系
(转自:http://www.open-open.com/lib/view/open1328059700311.html) 在UML类图中,常见的有以下几种关系: 泛化(Generalization) ...
- C++复习15.指针知识
C++复习15.指针知识 4.指针知识 在Tencent 笔试和面试中都考到了 C/C++中的指针知识,因为自己很不喜欢使用指针,所以才开始学习 Java的,但是现在看来还是躲不掉的,所 ...
- Java进阶2 数组内存和对象的内存管理知识
Java进阶2 数组内存和对象的内存管理知识 20131028 前言: 在面试的时候,如果是Java的编程语言,也许你认为没有什么可以问的,只能够说明你对于Java了解的太浅了,几乎就是两个星期的节奏 ...