推薦閱讀:《設(shè)計模式之禪》
Demo github地址:【FactoryPattern】
FactoryPattern
設(shè)計模式之工廠模式
定義一個用于創(chuàng)建對象的接口,讓子類決定實(shí)例化哪一個類。工廠方法使一個類的實(shí)例化延遲到他的子類。
A、工廠模式的優(yōu)點(diǎn)
- 良好的封裝性
- 擴(kuò)展性好
- 可以屏蔽產(chǎn)品類
- 工廠模式是典型的解耦框架
B、使用場景
- new對象的替代品
- 構(gòu)建靈活的、可擴(kuò)展的框架
- 可應(yīng)用于異構(gòu)項(xiàng)目
- 可使用在測試驅(qū)動開發(fā)的框架下
C、模式組成:
- 1、抽象產(chǎn)品類:
AbstractTeaProduct - 2、具體產(chǎn)品類:
QimenBlackTea、DianBlackTea、RouguiWulongTea - 3、抽象工廠類:
AbstractTeaFactory - 4、具體工廠類:
ConcreteTeaFactory
本Demo以茶為產(chǎn)品,制茶廠為產(chǎn)品生產(chǎn)者。
一、抽象產(chǎn)品類
public abstract class AbstractTeaProduct {
/**
* 茶湯顏色
*/
public abstract void teaColor();
/**
* 干茶外形
*/
public abstract void dryTeaShape();
/**
* 茶香
*/
public abstract void teaFlavor();
}
二、具體產(chǎn)品類
- QimenBlackTea
public class QimenBlackTea extends AbstractTeaProduct {
@Override
public void teaColor() {
System.out.println("祁門紅茶 - 湯色紅艷明亮");
}
@Override
public void teaFlavor() {
System.out.println("祁門紅茶 - 【花香】蘊(yùn)含著玫瑰花香,香氣馥郁持久;滋味甘甜醇厚");
}
@Override
public void dryTeaShape() {
System.out.println("祁門紅茶 - 條索緊細(xì)勻整,鋒苗秀麗,色澤烏潤");
}
}
- DianBlackTea
public class DianBlackTea extends AbstractTeaProduct {
@Override
public void teaColor() {
System.out.println("滇紅 - 湯色紅濃透明,金圈顯露");
}
@Override
public void teaFlavor() {
System.out.println("滇紅 - 【花果香】香氣高純持久;滋味濃厚鮮爽");
}
@Override
public void dryTeaShape() {
System.out.println("滇紅 - 條索緊直肥壯,苗鋒秀麗完整,金毫多而顯露,色澤油潤");
}
}
三、抽象工廠類
泛型,實(shí)現(xiàn)了AbstractTeaProduct抽象類的類都可以作為參數(shù)傳入。
public abstract class AbstractTeaFactory {
public abstract <T extends AbstractTeaProduct>T makeTea(Class<T> tea);
}
四、具體工廠類
public class ConcreteTeaFactory extends AbstractTeaFactory {
@Override
public <T extends AbstractTeaProduct> T makeTea(Class<T> concreteTea) {
AbstractTeaProduct tea = null;
try{
tea = (AbstractTeaProduct) Class.forName(concreteTea.getName()).newInstance();
}catch (Exception e){
// 異常處理
}
return (T)tea;
}
}
五、場景類
public class LisaTheCat {
public static void main(String[] args){
AbstractTeaFactory creator = new ConcreteTeaFactory();
// 祁門紅茶
AbstractTeaProduct qimenBlackTea = creator.makeTea(QimenBlackTea.class);
qimenBlackTea.dryTeaShape();
qimenBlackTea.teaColor();
qimenBlackTea.teaFlavor();
System.out.println("---------------");
// 滇紅
AbstractTeaProduct dianBlackTea = creator.makeTea(DianBlackTea.class);
dianBlackTea.dryTeaShape();
dianBlackTea.teaColor();
dianBlackTea.teaFlavor();
System.out.println("---------------");
// 肉桂
AbstractTeaProduct rouguiWulongTea = creator.makeTea(RouguiWulongTea.class);
rouguiWulongTea.dryTeaShape();
rouguiWulongTea.teaColor();
rouguiWulongTea.teaFlavor();
}
}
D、簡單工廠模式
簡化去除AbstractHumanFactory,將makeTea方法定義為靜態(tài)方法。
public class SimpleTeaFactory{
public static <T extends AbstractTeaProduct> T makeTea(Class<T> concreteTea) {
AbstractTeaProduct tea = null;
try{
tea = (AbstractTeaProduct) Class.forName(concreteTea.getName()).newInstance();
}catch (Exception e){
// 異常處理
}
return (T)tea;
}
}
E、用工廠模式替代單例模式
單例模式的核心:
在內(nèi)存中只有一個對象
- 需要單例的類:
public class Singleton {
private Singleton(){}
public void method(){}
}
- 創(chuàng)建單例的工廠類:
【利用反射的方式,為原本無法創(chuàng)建對象的單例類創(chuàng)建一個單例對象】:
public class SingletonFactory {
private static Singleton singleton;
static {
try {
Class myClass = Class.forName(Singleton.class.getName());
Constructor constructor = myClass.getDeclaredConstructor();
constructor.setAccessible(true);
singleton = (Singleton) constructor.newInstance();
}catch (Exception e){
System.out.println("some exception");
}
}
public static Singleton getSingleton(){
return singleton;
}
}