工廠模式 Factory MD

Markdown版本筆記 個人GitHub首頁 個人博客 個人微信 個人郵箱
MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

目錄

工廠模式

工廠模式是咱們最經常使用的實例化對象模式了,是用工廠方法代替new操做的一種模式。著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在Java程序系統能夠說是隨處可見。由於工廠模式就至關於建立實例對象的new,咱們常常要根據類Class生成實例 對象,如A a=new A() 工廠模式也是用來建立實例對象的,因此之後new時就要多個心眼,是否能夠考慮使用工廠模式,雖然這樣作,可能多作一些工做,但會給你係統帶來更大的可擴 展性和儘可能少的修改量。java

簡單工廠、工廠方法、抽象工廠的區別git

簡單工廠,只有一個產品接口github

  • 定義:專門定義一個類來負責建立其餘類的實例,被建立的實例一般具備共同的父類或實現同一接口
  • 優勢:客戶端能夠直接消費產品,而沒必要關心具體產品的實現,消除了客戶端直接建立產品對象的責任,實現了對責任的分割
  • 侷限:工廠類記錄了全部同類產品的建立邏輯,一旦不能正常工做,整個系統都會受到影響;當產品種類多、結構複雜的時候,把全部建立工做放進一個工廠中來,會使後期程序的擴展較爲困難
  • 簡單工廠模式沒有抽象工廠類且其工廠類的工廠方法是靜態的

工廠方法,既有產品接口也有工廠接口微信

  • 定義:在簡單工廠的基礎上,爲工廠類定義了工廠接口,讓其子類決定實例化哪一個產品類
  • 優勢:簡單工廠是把建立產品的職能都所有放在一個類裏面,而工廠方法則是把不一樣的產品放在實現了工廠接口的不一樣工廠類裏面,分割了工廠類的職能。

抽象工廠框架

  • 定義:抽象工廠提供一個固定的接口,用於建立一系列關聯或者相依存的對象,而沒必要指定其具體類或其建立的細節。
  • 特色:工廠方法用來建立一個產品,它沒有分類的概念,而抽象工廠則用於建立一系列產品,因此產品分類成了抽象工廠的重點。

簡單工廠模式 Simple Factory

簡單工廠模式(Simple Factory Pattern)又叫靜態工廠方法模式(Static FactoryMethod Pattern),是經過專門定義一個類來負責建立其餘類的實例,被建立的實例一般都具備共同的父類或接口。ide

做用:代替構造函數建立對象 函數

簡單工廠模式中包含的角色及其相應的職責以下:性能

  • 工廠角色:這是簡單工廠模式的核心,由它負責建立全部的類的內部邏輯。
  • 抽象產品角色:簡單工廠模式所建立的全部對象的父類,它負責描述全部實例所共有的公共接口。
  • 具體產品角色:簡單工廠所建立的具體實例對象,這些具體的產品每每都擁有共同的父類。

JDK中體現:Integer.valueOf、Class.forName code

抽象產品類

女媧造人案例對象

首先定義人類的總稱,能夠經過抽象類或接口定義

public interface IHuman {
    public void talk();
}

具體產品類

而後定義你所須要的具體的人種,不一樣的產品具備不一樣的特性或功能

class WhiteHuman implements IHuman {
    @Override
    public void talk() {
        System.out.println("白色人種會說English");
    }
}
class BlackHuman implements IHuman {
    @Override
    public void talk() {
        System.out.println("黑人能夠說話,通常人聽不懂");
    }
}
class YellowHuman implements IHuman {
    @Override
    public void talk() {
        System.out.println("黃色人種會說漢語");
    }
}

工廠類

public class HumanFactory {
    public static IHuman createHuman(Class<? extends IHuman> c) { //經過泛型限定了要生產的對象的類型
        //注意,生成產品的方式能夠是各類各樣的,好比最多見的方式爲根據傳入的String或int值,構造出不一樣的對象
        IHuman human = null;
        try {
            human = (IHuman) Class.forName(c.getName()).newInstance(); //這裏是經過反射方式生成的
        } catch (Exception e) {
            System.out.println("構造失敗");
        }
        return human;
    }
}

因爲簡單工廠模式新增產品時須要直接修改工廠類,違反了開放封閉原則。所以可使用反射來建立實例對象,確保可以遵循開放封閉原則。

客戶端使用

IHuman yellowHuman = HumanFactory.createHuman(YellowHuman.class);
yellowHuman.talk();

工廠方法模式 Factory Method

定義一個用於建立對象的接口,讓子類決定實例化哪一個類。

定義了一個工廠接口,由抽象工廠類的子類決定要實例化的類是抽象產品類的哪個子類。

工廠方法讓類的實例化推遲到子類。

角色說明:

  • Product(抽象產品類):要建立的複雜對象,定義對象的公共接口。
  • ConcreteProduct(具體產品類):實現Product接口。
  • Factory(抽象工廠類):該方法返回一個Product類型的對象。
  • ConcreteFactory(具體工廠類):返回ConcreteProduct實例。

優勢

  • 符合開放封閉原則。新增產品時,只需增長相應的具體產品類和相應的工廠子類便可。
  • 符合單一職責原則。每一個具體工廠類只負責建立對應的產品。

缺點

  • 一個具體工廠只能建立一種具體產品,增長新產品時,還需增長相應的工廠類,系統類的個數將成對增長,增長了系統的複雜度和性能開銷。
  • 引入的抽象類也會致使類結構的複雜化。

工廠方法模式新增產品時只需新建一個工廠類便可,符合開放封閉原則;而簡單工廠模式須要直接修改工廠類,違反了開放封閉原則。

抽象產品類(產品接口)

public interface IWork {
    void doWork();
}

具體產品類

class StudentWork implements IWork {
    @Override
    public void doWork() {
        System.out.println("學生的工做是作做業!");
    }
}
class TeacherWork implements IWork {
    @Override
    public void doWork() {
        System.out.println("老師的工做是審批做業!");
    }
}

工廠接口類

工廠方法是建立一個框架,讓【子類】決定要如何實現具體的產品。

public interface IWorkFactory {
    IWork getWork();
}

具體工廠類

根據不一樣的產品,定義不一樣的具體工廠類

class StudentWorkFactory implements IWorkFactory {
    @Override
    public IWork getWork() {
        return new StudentWork();//子類決定如何實現具體的產品
    }
}
class TeacherWorkFactory implements IWorkFactory{
    @Override
    public IWork getWork() {
        return new TeacherWork();//子類決定如何實現具體的產品
    }
}

客戶端使用

IWorkFactory studentWorkFactory = new StudentWorkFactory();
IWork studentWork = studentWorkFactory.getWork();//使用StudentWorkFactory構建StudentWork
studentWork.doWork();//學生的工做是作做業!

IWorkFactory teacherWorkFactory = new TeacherWorkFactory();
IWork teacherWork = teacherWorkFactory.getWork();//使用TeacherWorkFactory構建TeacherWork
teacherWork.doWork();//老師的工做是審批做業!

抽象工廠模式 Abstract Factory

爲建立一組相關或者相互依賴的對象提供一個接口,而無需指定它們的具體類。

工廠方法模式每一個工廠只能建立一種類型的產品,而抽象工廠模式則可以建立多種類型的產品。

例如:硬盤工廠只生產硬盤這種產品,而電腦工廠則組合不一樣的硬盤、內存、CPU等生產出電腦來。

角色說明:

  • AbstractProduct(抽象產品類):定義產品的公共接口。
  • ConcreteProduct(具體產品類):定義產品的具體對象,實現抽象產品類中的接口。
  • AbstractFactory(抽象工廠類):定義工廠中用來建立不一樣產品的方法。
  • ConcreteFactory(具體工廠類):實現抽象工廠中定義的建立產品的方法。

應用場景:生產多個產品組合的對象時。
優勢:代碼解耦,建立實例的工做與使用實例的工做分開,使用者沒必要關心類對象如何建立。
缺點:若是增長新的產品,則修改抽象工廠和全部的具體工廠,違反了開放封閉原則

工廠方法模式與抽象工廠模式比較

  • 工廠方法用來建立一個產品,它沒有分類的概念,而抽象工廠則用於建立一系列產品,因此產品分類成了抽象工廠的重點。
  • 在工廠方法模式中,具體工廠負責生產具體的產品,每個具體工廠對應一種具體產品,工廠方法具備惟一性;抽象工廠模式則能夠提供多個產品對象,而不是單一的產品對象。

產品

產品接口

定義人類的統稱

public interface IHuman {
    void talk();
    void sex();//定義性別,注意,這個是用來給人類【分類】的,在抽象工廠中,很重要的一步就是合理的分類
}

抽象產品類(產品等級)

人類的接口定義好,而後根據接口建立兩個抽象類,也就是兩個【產品等級】

public abstract class AbstractYellowHuman implements IHuman {
    @Override
    public void talk() {
        System.out.println("黃種人會說漢語");
    }
}
public abstract class AbstractWhiteHuman implements IHuman {
    @Override
    public void talk() {
        System.out.println("白色人種會說English");
    }
}

具體產品類(產品族)

而後就是些實現類了

public class YellowFemaleHuman extends AbstractYellowHuman {
    @Override
    public void sex() {
        System.out.println("女性黃種人");
    }
}
public class YellowMaleHuman extends AbstractYellowHuman {
    @Override
    public void sex() {
        System.out.println("男性黃種人");
    }
}
public class WhiteFemaleHuman extends AbstractWhiteHuman {
    @Override
    public void sex() {
        System.out.println("女性白種人");
    }
}
public class WhiteMaleHuman extends AbstractWhiteHuman {
    @Override
    public void sex() {
        System.out.println("男性白種人");
    }
}

工廠

工廠接口

public interface IHumanFactory {
    IHuman createYellowHuman();//製造黃色人種
    IHuman createWhiteHuman();//製造白色人種
}

抽象工廠類(產生產品等級)

這個抽象類的目的就是減小下邊實現類的代碼量。

public abstract class AbstractHumanFactory implements IHumanFactory {
    protected IHuman createHuman(HumanEnum humanEnum) {
        IHuman human = null; //給定一個性別人種,建立一我的類出來 專業術語是產生產品等級
        try {
            human = (IHuman) Class.forName(humanEnum.getValue()).newInstance();//直接產生一個實例
        } catch (Exception e) {
            e.printStackTrace();
        }
        return human;
    }
}

具體工廠類

男性建立工廠,只建立男性

public class MaleHumanFactory extends AbstractHumanFactory {
    //建立一個男性白種人
    @Override
    public IHuman createWhiteHuman() {
        return super.createHuman(HumanEnum.WhiteMaleHuman);
    }
    //建立一個男性黃種人
    @Override
    public IHuman createYellowHuman() {
        return super.createHuman(HumanEnum.YelloMaleHuman);
    }
}

女性建立工廠,只建立女性

public class FemaleHumanFactory extends AbstractHumanFactory {
    //建立一個女性白種人
    @Override
    public IHuman createWhiteHuman() {
        return super.createHuman(HumanEnum.WhiteFemaleHuman);
    }
    //建立一個女性黃種人\
    @Override
    public IHuman createYellowHuman() {
        return super.createHuman(HumanEnum.YelloFemaleHuman);
    }
}

客戶端使用

產品定義好了,工廠也定義好了,萬事俱備只欠東風,那咱就開始造人吧,哦,不對,女媧開始造人了:

public class Test {
    //女媧創建起了兩條生產線,分別是男性生產線和女性生產線
    public static void main(String[] args) {
        //第一條生產線,男性生產線,能夠生產各類各樣的男性
        IHumanFactory maleHumanFactory = new MaleHumanFactory();
        IHuman maleYellowHuman = maleHumanFactory.createYellowHuman();//生產黃色的男性
        IHuman maleWhiteHuman = maleHumanFactory.createWhiteHuman();//生產白色的男性

        //第二條生產線,女性生產線,能夠生產各類各樣的女性
        IHumanFactory femaleHumanFactory = new FemaleHumanFactory();
        IHuman femaleYellowHuman = femaleHumanFactory.createYellowHuman();//生產黃色的女性
        IHuman femaleWhiteHuman = femaleHumanFactory.createWhiteHuman();//生產白色的女性
    }
}

2019-4-6

相關文章
相關標籤/搜索