1. 程式人生 > >大話設計模式一:簡單工廠模式

大話設計模式一:簡單工廠模式

一.模式定義

簡單工廠模式也稱為靜態工廠模式。屬於類建立型設計模式。實質是一個“”工廠系統“”可以產生出多種不同的”產品物件”,使用者不需要知道“”產品物件“”是怎麼產生的,只需要知道關於該“產品物件”的關鍵引數,將該引數傳給“工廠系統”就可以由工廠系統生產出對應的產品。

二.模式要素

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)客戶端只知道傳入工廠類的引數,對於如何建立物件不關心。