码迷,mamicode.com
首页 > 其他好文 > 详细

理解设计模式(工厂)

时间:2015-11-21 22:50:06      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:

  工厂模式,见名知意:创建工厂,来生产商品。
  Java中,工厂和商品就是对象。

使用时机
工厂模式功能上相当于new,都是创建对象
但前者名称决定,其具有工厂的特性

  • 工厂根据要求生产商品,商品种类并不单一
  • 工厂如何生产,外界不需要得知

对于Java来说,工厂模式按条件获取不同类的对象,同时屏蔽对象的细节

分为

  • 简单工厂
  • 工厂方法
  • 抽象工厂3种

简单工厂模式 —— Simple Factory

3个角色:工厂类F、抽象产品A、具体产品C
具体来说,C实现A,F生产A,但实际C被创建
一句话,父类变量指向子类对象

F:由具体类实现,一般有判断和业务逻辑
A:由接口或抽象类实现,一般有抽象方法,供C实现
C:由具体类继承或实现A,F实际创建对象类

CarFactory.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package com.suzhw.design.pattern.factory.factory;

import java.util.HashMap;
import java.util.Map;

import com.suzhw.design.pattern.factory.product.Car;
import com.suzhw.design.pattern.factory.product.impl.AudiCar;
import com.suzhw.design.pattern.factory.product.impl.BenZCar;
import com.suzhw.design.pattern.factory.product.impl.QQCar;
import com.suzhw.util.string.StringUtil;

/**
* @author suzhw<br>
* 日期:2014-7-12<br>
* 功能:根据需求,生产汽车<br>
* @version 1.0
* @see
*/
public class CarFactory {
private static Map<String, Integer> carType;

static {
CarFactory.carType = new HashMap<String, Integer>();
CarFactory.carType.put("AudiCar", 1);
CarFactory.carType.put("BenZCar", 2);
CarFactory.carType.put("QQCar", 3);
}

public CarFactory() {
}

/**
* 根据条件,生产汽车
*
* @param target
* @throws Exception
*/
public static Car produceCar(String target) throws Exception {
if (StringUtil.isValidate(target)) {
return proCarByTarget(target);
} else {
throw new Exception("原料不足,无法生产");
}
}

/**
* <pre>
* @author suzhw
* 2014-7-12 下午7:47:38
* <b>作用:按条件,生产汽车</b>
* <b>使用场合:内部方法,屏蔽生产细节</b>
*
* @param target
* @return <br/>
* return: Car
* @throws Exception
* @exception
* @since 1.0.0
* </pre>
*/
private static Car proCarByTarget(String target) throws Exception {
switch (CarFactory.carType.get(target)) {
case 1:
return new AudiCar();
case 2:
return new BenZCar();
case 3:
return new QQCar();
default:
throw new Exception("无法生产");
}
}
}

Car.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.suzhw.design.pattern.factory.product;

/**
* @author suzhw<br>
* 日期:2014-7-12<br>
* 功能:车<br>
* @version 1.0
* @see
*/
public interface Car {
/**
* <pre>
* @author suzhw
* 2014-7-12 下午8:17:13
* <b>作用:汽车启动</b>
* <b>使用场合:汽车启动时</b>
* <br/>
* return: void
* @exception
* @since 1.0.0
*</pre>
*/
public void start();
}

AudiCar.java

1
2
3
4
5
6
7
8
9
10
11
package com.suzhw.design.pattern.factory.product.impl;

import com.suzhw.design.pattern.factory.product.Car;

public class AudiCar implements Car {

public void start() {
System.out.println("奥迪车启动");
}

}

BenZCar.java

1
2
3
4
5
6
7
8
9
10
11
package com.suzhw.design.pattern.factory.product.impl;

import com.suzhw.design.pattern.factory.product.Car;

public class BenZCar implements Car {

public void start() {
System.out.println("奔驰车启动");
}

}

QQCar.java

1
2
3
4
5
6
7
8
9
10
11
package com.suzhw.design.pattern.factory.product.impl;

import com.suzhw.design.pattern.factory.product.Car;

public class QQCar implements Car {

public void start() {
System.out.println("QQ车启动");
}

}

可以看出,简单工厂模式,产品抽象实现,而工厂具体实现
如此,产品符合开闭原则
可以不断扩展产品的种类,但每扩展一次,都要修改工厂类

工厂方法模式避免了这种修改

工厂方法模式 —— Factory Method

相比于简单工厂模式,工厂方法模式的角色增加到4个

  • 抽象工厂:核心,与业务无关,接口或抽象类实现
  • 具体工厂:含业务逻辑,具体类实现
  • 抽象产品:接口或抽象类实现
  • 具体产品

该模式,是一个工厂,只生产一种商品
不过要先确定使用哪种工厂类

抽象工厂模式 —— Abstract Factory

先说等级结构产品族
等级结构:相当于产品的不同品牌
产品族:相当于不同品牌、但功能相似的产品集合

抽象工厂模式,一个工厂,能够生产不同品牌下、功能相似产品组成的产品族

工厂接口中可不声明方法
若已知产品族数量时,可以按需声明
若产品族数量发生变化,则可重新声明工厂接口

理解设计模式(工厂)

标签:

原文地址:http://www.cnblogs.com/CoolSoul/p/4984917.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!