大話設計模式一:簡單工廠模式
一.模式定義
簡單工廠模式也稱為靜態工廠模式。屬於類建立型設計模式。實質是一個“”工廠系統“”可以產生出多種不同的”產品物件”,使用者不需要知道“”產品物件“”是怎麼產生的,只需要知道關於該“產品物件”的關鍵引數,將該引數傳給“工廠系統”就可以由工廠系統生產出對應的產品。
二.模式要素
1.具體工廠:簡單工廠模式的核心,負責實現建立所有具體產品類的例項。工廠類可以被外界直接呼叫來建立所需的產品物件。
2.抽象產品:是所有具體產品的父類,負責描述所有例項所共有的公共介面。
3.具體產品:繼承自抽象產品角色,一般為多個,是簡單工廠模式的建立目標。工廠類返回的都是該角色的某一具體產品。
4.使用者:場景的應用者。
三.舉例說明
我們以王者榮耀的場景進行說明,想象有一個英雄工廠專門用來生產各種職業的英雄。英雄有坦克、戰士、刺客、法師、射手、輔助6種職業。則英雄產生的過程見下圖。
四.程式碼實現
工程結構如下:
1.抽象英雄:IHero.java
package simpleFactory; /** * @program: DesignModes * @description:英雄抽象類 * @author: Lei Dong * @create: 2018-09-02 09:45 **/ public interface IHero { public void showDesc(); }
2.坦克:Tank.java
package simpleFactory;
/**
* @program: DesignModes
* @description: 坦克英雄
* @author: Lei Dong
* @create: 2018-09-02 09:47
**/
public class Tank implements IHero {
@Override
public void showDesc() {
System.out.println("我是一名坦克");
}
}
3.戰士:Warrior.java
package simpleFactory; /** * @program: DesignModes * @description:戰士英雄 * @author: Lei Dong * @create: 2018-09-02 09:48 **/ public class Warrior implements IHero { @Override public void showDesc() { System.out.println("我是一名戰士"); } }
4.刺客:Assassinator.java
package simpleFactory;
/**
* @program: DesignModes
* @description:刺客英雄
* @author: Lei Dong
* @create: 2018-09-02 09:49
**/
public class Assassinator implements IHero {
@Override
public void showDesc() {
System.out.println("我是一名刺客");
}
}
5.射手:Shooter.java
package simpleFactory;
/**
* @program: DesignModes
* @description:射手英雄
* @author: Lei Dong
* @create: 2018-09-02 09:49
**/
public class Shooter implements IHero {
@Override
public void showDesc() {
System.out.println("我是一名射手");
}
}
6.法師:Mage.java
package simpleFactory;
/**
* @program: DesignModes
* @description:法師英雄
* @author: Lei Dong
* @create: 2018-09-02 09:50
**/
public class Mage implements IHero {
@Override
public void showDesc() {
System.out.println("我是一名法師");
}
}
7.輔助:Assistant.java
package simpleFactory;
/**
* @program: DesignModes
* @description:輔助英雄
* @author: Lei Dong
* @create: 2018-09-02 10:18
**/
public class Assistant implements IHero {
@Override
public void showDesc() {
System.out.println("我是一名輔助");
}
}
8.英雄工廠:HeroFactory.java
package simpleFactory;
/**
* @program: DesignModes
* @description: 英雄工廠
* @author: Lei Dong
* @create: 2018-09-02 09:40
**/
public class HeroFactory {
public IHero createHero(String style) {
IHero hero = null;
switch (style) {
case "tank":
hero = new Tank();
break;
case "warrior":
hero = new Warrior();
break;
case "assassinator":
hero = new Assassinator();
break;
case "shooter":
hero = new Shooter();
break;
case "mage":
hero = new Mage();
break;
case "assistant":
hero = new Assistant();
break;
default:
break;
}
return hero;
}
}
9.使用者:Main.java
package simpleFactory;
/**
* @program: DesignModes
* @description: Main
* @author: Lei Dong
* @create: 2018-09-02 09:39
**/
public class Main {
public static void main(String[] args) {
HeroFactory heroFactory = new HeroFactory();
IHero hero = heroFactory.createHero("shooter");
hero.showDesc();
}
}
執行結果:
五.總結
1.簡單工廠模式的優點
(1)使用者不需要直接建立產品,而是直接消費產品。使得產品的建立和使用解耦。
(2)使用者通過引數就可以建立產品。
2.簡單工廠模式的缺點
(1)工廠類集中了所有產品建立邏輯,一旦不能正常工作,整個系統都要受到影響。
(2)使用簡單工廠模式將會增加系統中類的個數,在一定程式上增加了系統的複雜度和理解難度。
(3)新增新產品就不得不修改工廠邏輯,在產品型別較多時,有可能造成工廠邏輯過於複雜,不利於系統的擴充套件和維護。
(4)簡單工廠模式由於使用了靜態工廠方法,造成工廠角色無法形成基於繼承的等級結構。
3.簡單工廠模式的適用環境
(1)工廠類負責建立的物件比較少,不會造成工廠方法中的業務邏輯太過複雜。
(2)客戶端只知道傳入工廠類的引數,對於如何建立物件不關心。