設計模式整理_原廠模式

來源:互聯網
上載者:User

標籤:

一.簡單原廠模式.

  通常情況下,在代碼中需要建立一系列對象的時候,如果需要建立新的同類型的對象,就需要對原代碼進行修改,此時就不符合對修改關閉的原則,因此,我們將建立對象於使用對象的代碼分隔開來,在工廠類中建立工廠,然後如果需要新的對象,只需要修改工廠的類即可.

  

public interface Car /*在這裡定義需要產生的執行個體,針對抽象組件*/{    public void run();}class BenzCar /*執行個體*/ implements Car {    @Override    public void run() {        System.out.println("Benz run.");    }    }class AudiCar /*執行個體*/ implements Car {    @Override    public void run() {        System.out.println("Audi run");    }}
public class CarFactory /*通過工廠產生執行個體*/{    String name;    public Car get(String name) {        if(name.equals("Benz")) {            return new BenzCar();        }        else if(name.equals("Audi")) {            return new AudiCar();        }        return null;    }}
/* * 測試簡單原廠模式. * */public class Test1 {    public static void main(String[] args) {        CarFactory factory=new CarFactory();        //定義工廠        AudiCar audi=(AudiCar) factory.get("Audi"); //產生AudiCar執行個體        BenzCar benz=(BenzCar) factory.get("Benz"); //產生BenzCar執行個體        audi.run();        benz.run();    }}

二.Factory 方法模式.

  Factory 方法模式定義了一個建立對象的介面,但由子類決定要執行個體化的類是哪一個,Factory 方法讓類把執行個體化延遲到子類.

  Factory 方法模式需要注意的細節:

  1.Factory 方法模式將工廠抽象成為介面(建立者類),在編寫建立類是不需要知道實際建立產品的是哪一個,選擇了使用哪個子類工廠就決定了實際建立的產品是什麼.

  2.對於建立者類如果增加產品或者改變產品的實現,它不會受到任何影響,這實現瞭解耦.

  3.簡單原廠模式不具備Factory 方法模式的彈性,因為簡單原廠模式不能變更正在建立的產品.

  Factory 方法模式體現了一個很重要的原則:要依賴抽象,不要依賴具體類.

  這個原則的具體內容是讓我們在編寫代碼的時候,最好依賴的都是抽象類別,而不依賴具體類,對於高層以及低層模組都應該如此.

  具體來說,即:變數不可以持有具體的類的引用,如果使用new,就會持有具體類的引用,應當採用工廠來避免這樣的情況發生.不要讓類派生自具體類,應當讓其派生於一個抽象,不要覆蓋基類中已實現的方法,基類已實現的方法應當由所有子類共用.

  以下是Factory 方法的執行個體,定義了產品介面Car,建立者介面CarFactory,採用具體的子類來產生具體的產品.

public interface Car/*定義產品類*/ {    public void run();}class GoodAudiCar implements Car/*實現具體的產品*/ {    @Override    public void run() {        System.out.println("Good Audi run..zzz");    }    }class BadAudiCar implements Car {    @Override    public void run() {        System.out.println("Bad Audi run...ouch!");    }}
public interface Factory /*定義建立者類,定義一個抽象的Factory 方法,讓子類去實現此方法.*/{public Car produceCar();}class GoodAudiFactory implements Factory /*實現具體的建立者.*/{@Overridepublic Car produceCar() {return new GoodAudiCar();}}class BadAudiFactory implements Factory{@Overridepublic Car produceCar() {return new BadAudiCar();}}
/* *     示範Factory 方法模式. * */public class Test2 {    public static void main(String[] args) {        Factory factory1=new GoodAudiFactory();        Factory factory2=new BadAudiFactory();                Car good=factory1.produceCar();        Car bad= factory2.produceCar();        good.run();        bad.run();    }}

  類圖如下:

三.抽象原廠模式.

  抽象原廠模式提供了一個介面,用來建立相關的對象的家族(一系列產品),而不需要明確制定具體類.

  引用新類型的工廠,也就是所謂的抽象工廠來建立一系列產品,通過抽象工廠所提供的介面,可以建立產品的家族,利用這個介面書寫代碼,可以在不同上下文中,實現各式各樣的工廠,建立出各種類型的產品,因為代碼從實際產品中解耦出來了,所以我們可以替換不同的工廠來取得不同的行為.

  Factory 方法模式是通過子類來建立具體的對象,負責將客戶從具體類型中,解耦,而抽象原廠模式將一群相關的產品集合起來,提供了一個用於建立一個產品家族的抽象類別型,這個類型的子類定義了產品被產生的方法,要想使用這個方法,必須先執行個體化它,然後將它傳入一些針對抽象類別型所寫的代碼中.

  下面是Factory 方法模式的執行個體,產品為Engine,Wheel類,抽象工廠Factory定義了產生產品族的方法,而將具體的實現交給其子類來完成,隨後在另一個類中,傳入工廠,擷取產品族.

  

/* * 定義Wheel產品 * */public interface Wheel {    public void run();}class GoodWheel implements Wheel {    @Override    public void run() {        System.out.println("GoodWheel run.");    }}class BadWheel implements Wheel {    @Override    public void run() {        System.out.println("BadWheel run.");    }    }
/* * 定義Engine產品 * */public interface Engine {    public void start();}class GoodEngine implements Engine{    @Override    public void start() {        System.out.println("GoodEngine start");    }}class BadEngine implements Engine {    @Override    public void start() {        System.out.println("BadEngine start");    }}
//定義抽象工廠來產生產品.public interface Factory {    /*兩個產品*/    public Engine getEngine();    public Wheel getWheel();}class GoodFactory implements Factory {    @Override    public Engine getEngine() {        return new GoodEngine();    }    @Override    public Wheel getWheel() {        return new GoodWheel();    }}class BadFactory implements Factory {    @Override    public Engine getEngine() {        return new BadEngine();    }    @Override    public Wheel getWheel() {        return new BadWheel();    }    }
//擷取產品族public abstract class Car {    Engine en;    Wheel wh;    public abstract void prepareCar();}class BadCar extends Car {    Factory fa;    /*需要傳入一個抽象工廠來擷取產品族*/    public BadCar(Factory fa) {        this.fa = fa;    }    @Override    public void prepareCar() {        en=fa.getEngine();        en.start();        wh=fa.getWheel();        wh.run();    }    }class GoodCar extends Car {    Factory fa;        public GoodCar(Factory fa) {        this.fa = fa;    }        @Override    public void prepareCar() {        en=fa.getEngine();        en.start();        wh=fa.getWheel();        wh.run();    }    }
//測試抽象Factory 方法.public class Test3 {    public static void main(String[] args) {        Factory fa1=new GoodFactory();    //建立一個抽象工廠的具體實作類別        Car c1=new GoodCar(fa1);    //像Car類中傳入工廠以擷取產品族        c1.prepareCar();            //調用擷取產品族的方法        Factory fa2=new BadFactory();        Car c2=new BadCar(fa2);        c2.prepareCar();    }}

  抽象原廠模式的類圖如下:

 

設計模式整理_原廠模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.