工厂模式,见名知意:创建工厂,来生产商品。
Java中,工厂和商品就是对象。
使用时机
工厂模式功能上相当于new,都是创建对象
但前者名称决定,其具有工厂的特性
- 工厂根据要求生产商品,商品种类并不单一
- 工厂如何生产,外界不需要得知
对于Java来说,工厂模式按条件获取不同类的对象,同时屏蔽对象的细节
分为
- 简单工厂
- 工厂方法
- 抽象工厂3种
简单工厂模式 —— Simple Factory
3个角色:工厂类F、抽象产品A、具体产品C
具体来说,C实现A,F生产A,但实际C被创建
一句话,父类变量指向子类对象
F:由具体类实现,一般有判断和业务逻辑
A:由接口或抽象类实现,一般有抽象方法,供C实现
C:由具体类继承或实现A,F实际创建对象类
CarFactory.java
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
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
123456789101112131415161718192021222324 |
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
1234567891011 |
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
1234567891011 |
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
1234567891011 |
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
先说等级结构和产品族
等级结构:相当于产品的不同品牌
产品族:相当于不同品牌、但功能相似的产品集合
抽象工厂模式,一个工厂,能够生产不同品牌下、功能相似产品组成的产品族
工厂接口中可不声明方法
若已知产品族数量时,可以按需声明
若产品族数量发生变化,则可重新声明工厂接口
时间: 2024-12-18 08:28:38