【設計模式】秒懂簡單工廠模式
簡單工廠模式介紹
概述
工廠模式是一種常見的創(chuàng)建型模式,即討論的是如何創(chuàng)建一個類的對象的問題。也許你會說,創(chuàng)建一個對象還不簡單哈,用new不就可以了嗎,好吧,你說的沒錯,但是如果你能夠用一種高逼格的方式將對象創(chuàng)建出來,是不是會讓你的leader刮目相看了?掌握了工廠模式就可以讓你做到這一點。
在 GoF 的《設計模式》一書中,工廠模式(Factory Design Pattern)一共分為三種:簡單工廠模式、工廠方法和抽象工廠。今天我們來介紹其中最簡單的簡單工廠模式。
使用場景
學習一種設計模式,我覺得最重要的一點之一就是你需要充分理解每種設計模式的使用場景。
當你想創(chuàng)建一個對象的時候,如果出現(xiàn)了以下幾種情況,那么可以考慮是不是該用工廠模式了:
? 1.不想直接new這個類的對象,防止這個類改變的時候在new的地方到處去改,麻煩且容易遺漏;
? 2.這個類的對象構建過程非常復雜,不想在代碼的各個地方將這么復雜的構建過程反復書寫;
? 3.這個類的對象在構建過程中依賴了很多其他的類,而你無法在調用的地方提供。
UML類圖
業(yè)務場景:小明是個運動鞋大亨,他承包了耐克和阿迪達斯兩個品牌的運動鞋的生產(chǎn),我們如何用代碼實現(xiàn)這個業(yè)務呢?
下面是簡單工廠模式的UML圖:

簡單工廠模式實現(xiàn)
簡單工廠模式實現(xiàn)
以上面的業(yè)務場景為例,可以按照下面的方式寫出對應的簡單工廠模式的代碼。
//1.定義鞋這種產(chǎn)品的抽象基類
abstract class Shoes{
public abstract void showLogo();
}
//2.定義具體品牌的鞋類,繼承鞋抽象基類
class NikeShoes extends Shoes{
@Override
public void showLogo() {
System.out.println("我是耐克鞋子");
}
}
//2.定義具體品牌的鞋類,繼承鞋抽象基類
class AdidasShoes extends Shoes{
@Override
public void showLogo() {
System.out.println("我是阿迪鞋子");
}
}
//3.定義簡單工廠方法類,使用一個靜態(tài)工廠方法來根據(jù)不同的品牌條件來產(chǎn)生不同品牌的鞋
class SimpleFactory {
public static Shoes makeShoes(String brand){
Shoes shoes = null;
switch (brand){
case "nike":
shoes = new NikeShoes();
break;
case "adidas":
shoes = new AdidasShoes();
break;
default:
System.out.println("錯誤的品牌");
}
return shoes;
}
}
//使用簡單工廠模式
public class SimpleFactoryExample{
public static void main(String[] args) {
//使用工廠模式創(chuàng)建耐克品牌的鞋子
Shoes nikeShoes = SimpleFactory.makeShoes("nike");
nikeShoes.showLogo();
//使用工廠模式創(chuàng)建阿迪品牌的鞋子
Shoes adidasShoes = SimpleFactory.makeShoes("adidas");
adidasShoes.showLogo();
}
}
******************【運行結果】******************
我是耐克鞋子
我是阿迪鞋子可以看出,簡單工廠模式的出現(xiàn),使得我們通過傳入不同的參數(shù)類型就可以創(chuàng)建不同類型的對象實例,將對象的構建過程完全交給了簡單工廠方法類SimpleFactory。
簡單工廠模式的缺點
簡單工廠模式的缺點用一句話介紹就是:違反了開閉原則,(對擴展開放,對修改關閉),破壞其內聚性,給維護帶來額外開支。這句話怎么理解了?我們還是舉個例子吧。
還是上面這個業(yè)務場景,假設現(xiàn)在小明的生意越做越大了,又拓展了安踏這個品牌,那么針對新增加的品牌,需要做如下改動:
//改動1:新增加安踏品牌,需要新增加有一個安踏鞋類繼承抽象基類
classAntaShoesextends Shoes{
@Override
public void showLogo() {
System.out.println("我是安踏鞋子");
}
}
//改動2:工廠方法類中方法增加一個創(chuàng)建安踏鞋子的分支
class SimpleFactory {
public static Shoes makeShoes(String brand){
Shoes shoes = null;
switch (brand){
case "nike":
shoes = new NikeShoes();
break;
case "adidas":
shoes = new AdidasShoes();
break;case "anta":
shoes = new AntaShoes();
break;
default:
System.out.println("錯誤的品牌");
}
return shoes;
}
}
可以看到,每當我們增加一種產(chǎn)品的時候就要去修改工廠方法。而不是擴展,這就是所謂的違反了開閉原則。為了克服簡單工廠模式的缺點,工廠方法模式就被提了出來,我們下篇文章再介紹。
本文源碼地址:
https://github.com/qinlizhong1/javaStudy/tree/master/DesignPattern/src/factory
本文示例代碼環(huán)境:
操作系統(tǒng):macOs 12.1
JDK版本:12.0.1
maven版本: 3.8.4
— 完 —
