推薦閱讀:《設計模式之禪》
Demo github地址:【FactoryPattern】
FactoryPattern
設計模式之工廠模式
定義一個用于創(chuàng)建對象的接口刀崖,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到他的子類狈究。
A、工廠模式的優(yōu)點
- 良好的封裝性
- 擴展性好
- 可以屏蔽產(chǎn)品類
- 工廠模式是典型的解耦框架
B盏求、使用場景
- new對象的替代品
- 構建靈活的抖锥、可擴展的框架
- 可應用于異構項目
- 可使用在測試驅動開發(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("祁門紅茶 - 【花香】蘊含著玫瑰花香导绷,香氣馥郁持久;滋味甘甜醇厚");
}
@Override
public void dryTeaShape() {
System.out.println("祁門紅茶 - 條索緊細勻整屎飘,鋒苗秀麗妥曲,色澤烏潤");
}
}
- 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("滇紅 - 條索緊直肥壯逾一,苗鋒秀麗完整铸本,金毫多而顯露,色澤油潤");
}
}
三遵堵、抽象工廠類
泛型箱玷,實現(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;
}
}