現(xiàn)實(shí)生活中,原始社會(huì)自給自足(沒(méi)有工廠(chǎng))
農(nóng)耕社會(huì)小作坊(簡(jiǎn)單工廠(chǎng),民間酒坊)
工業(yè)革命流水線(xiàn)(工廠(chǎng)方法,自產(chǎn)自銷(xiāo))
現(xiàn)代產(chǎn)業(yè)鏈代工廠(chǎng)(抽象工廠(chǎng),富士康)
工廠(chǎng)模式的定義:
定義一個(gè)創(chuàng)建對(duì)象的工廠(chǎng)接口,將對(duì)象的實(shí)際創(chuàng)建工作扔到具體子工廠(chǎng)類(lèi)中。滿(mǎn)足了創(chuàng)建型模式中所要求的“創(chuàng)建與使用相分離”的特點(diǎn)
簡(jiǎn)單工廠(chǎng)模式定義
簡(jiǎn)單工廠(chǎng)中創(chuàng)建對(duì)象的方法一般為靜態(tài)方法,所以簡(jiǎn)單工廠(chǎng)又叫靜態(tài)工廠(chǎng)方法模式(Static Factory Method Pattern)
通俗的說(shuō),簡(jiǎn)單工廠(chǎng)模式有一個(gè)具體的工廠(chǎng)類(lèi),可以生產(chǎn)不同的產(chǎn)品。
但是該模式每增加一種產(chǎn)品就要增加一個(gè)具體產(chǎn)品類(lèi)和一個(gè)對(duì)應(yīng)的具體工廠(chǎng)類(lèi),違背開(kāi)閉原則。
優(yōu)點(diǎn):
1. 工廠(chǎng)類(lèi)包含必要的邏輯判斷,可以決定在什么時(shí)候創(chuàng)建哪一個(gè)產(chǎn)品的實(shí)例。客戶(hù)端可以免除直接創(chuàng)建產(chǎn)品對(duì)象的職責(zé)。工廠(chǎng)和產(chǎn)品的職責(zé)區(qū)分明確
2. 客戶(hù)端不需要知道創(chuàng)建的產(chǎn)品的類(lèi)名,只需要知道參數(shù)即可
3. 可以引入配置文件,在不修改客戶(hù)端代碼的情況下更換和添加新的具體產(chǎn)品類(lèi)
缺點(diǎn):
1. 簡(jiǎn)單工廠(chǎng)模式的工廠(chǎng)單一,職責(zé)過(guò)重。且代碼會(huì)很臃腫,違背高聚合原則
2. 會(huì)增加系統(tǒng)中工廠(chǎng)類(lèi)的個(gè)數(shù),復(fù)雜度增加
3. 拓展困難,因?yàn)楹?jiǎn)單工廠(chǎng)使用了static工廠(chǎng)方法,無(wú)法形成基于繼承的等級(jí)結(jié)構(gòu)
應(yīng)用場(chǎng)景:
對(duì)于產(chǎn)品種類(lèi)較少的情況使用簡(jiǎn)單工廠(chǎng)模式。
模式結(jié)構(gòu):
1. 簡(jiǎn)單工廠(chǎng)(SimpleFactory):負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯。創(chuàng)建對(duì)象的方法可以被外界直接調(diào)用
2. 抽象產(chǎn)品(Product):簡(jiǎn)單工廠(chǎng)創(chuàng)建的對(duì)象的父類(lèi),負(fù)責(zé)描述所有實(shí)例的共有的公共接口
3. 具體產(chǎn)品(ConcreteProduct):簡(jiǎn)單工廠(chǎng)的創(chuàng)建目標(biāo)
實(shí)現(xiàn):
/**
* @Author: KenChen
* @Description: 簡(jiǎn)單工廠(chǎng)模式示例
* @Date: Create in 2022/5/11 17:52
*/
public class Client {
public static void main(String[] args) {
Product product1 = SimpleFactory.makeProduct(Const.PRODUCT_A);
Product product2 = SimpleFactory.makeProduct(Const.PRODUCT_B);
product1.show();
product2.show();
}
// 抽象產(chǎn)品
public interface Product {
void show();
}
// 具體產(chǎn)品類(lèi)
static class ConcreteProduct1 implements Product {
@Override
public void show() {
System.out.println("具體產(chǎn)品1");
}
}
static class ConcreteProduct2 implements Product {
@Override
public void show() {
System.out.println("具體產(chǎn)品2");
}
}
final class Const{
static final int PRODUCT_A = 1;
static final int PRODUCT_B = 2;
}
// 工廠(chǎng)類(lèi)
static class SimpleFactory{
public static Product makeProduct(int kind){
switch (kind){
case 1:
return new ConcreteProduct1();
case 2:
return new ConcreteProduct2();
default:
break;
}
return null;
}
}
}