工厂模式,见名知意:创建工厂,来生产商品。
Java中,工厂和商品就是对象。
使用时机
工厂模式功能上相当于new,都是创建对象
但前者名称决定,其具有工厂的特性
- 工厂根据要求生产商品,商品种类并不单一
- 工厂如何生产,外界不需要得知
对于Java来说,工厂模式按条件获取不同类的对象,同时屏蔽对象的细节
分为
简单工厂模式 —— 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
先说等级结构和产品族
等级结构:相当于产品的不同品牌
产品族:相当于不同品牌、但功能相似的产品集合
抽象工厂模式,一个工厂,能够生产不同品牌下、功能相似产品组成的产品族
工厂接口中可不声明方法
若已知产品族数量时,可以按需声明
若产品族数量发生变化,则可重新声明工厂接口