工廠方法模式使用的頻率非常高,在我們的日常開發中總能見到,也許你一直在使用但是卻不知道其實他的名字叫工廠方法模式。
工廠方法模式的定義如下:
定義一個用於創建對象的接口,讓子類決定實例化哪一個類。
工廠方法的通用類圖如下:
工廠方法模式的通用代碼如下:
public abstract class Creator {
public abstract <T extends Product> T factoryMethod(Class<T> c);
}
public class ConcreteCreator extends Creator {
/**
* @param c
* @return
*/
@Override
public <T extends Product> T factoryMethod(Class<T> c) {
Product product=null;
try {
product=(Product) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
// TODO Auto-generated catch blockd
e.printStackTrace();
}
return (T) product;
}
}
public abstract class Product {
// 公共方法
public void sameMethod() {
}
public abstract void doSomething();
}
public class ConcreteProduct extends Product {
/**
*
* @see com.huashao.chapter.chapter08.Product#doSomething()
*/
@Override
public void doSomething() {
System.out.println("具體業務邏輯");
}
}
看完通用類圖和通用代碼之後,不知道大家會不會想起自己的代碼是否有用過的此模式的地方
工廠模式的優點:
- 良好的封裝性
- 靈活的擴展性
- 屏蔽產品類(產品類的實現如何變化,調用者都不需要關心,它只關心產品的接口,只要接口不變,系統中的高層模塊就不需要改變)
具體應用之汽車生產
public abstract class AbstractCar {
// 每個汽車都能跑
protected abstract void run();
}
public class BenzCar extends AbstractCar {
/**
*
* @see com.huashao.chapter.chapter08.AbstractCar#run()
*/
@Override
protected void run() {
System.out.println("奔馳生產成功");
}
}
public abstract class AbstractCarFactory {
// 生產汽車
protected abstract <T extends AbstractCar> T createCar(Class<T> c);
}
public class CarFactory extends AbstractCarFactory {
/**
* 生產汽車
*
* @param c
* @return
*/
@Override
protected <T extends AbstractCar> T createCar(Class<T> c) {
AbstractCar car = null;
try {
car = (T) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
System.out.println("生產汽車時發生異常:" + e.getMessage());
}
return (T) car;
}
}