可複用面向對象軟件基礎——設計模式(三)之抽象工廠模式

一、工廠方法模式缺陷

工廠方法模式有一個問題就是,類的創建依賴工廠類,也就是說,如果想要拓展程序,必須修改工廠類,這違背了設計模式六大原則第一條閉包原則

所以,從設計角度考慮,有一定的問題,如何解決?就用到抽象工廠模式,創建多個工廠類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的代碼。

這裏寫圖片描述

二、抽象工廠模式實現

/**
 * 1、郵寄接口,有一個抽象郵寄方法待實現
 * @author barnett
 *
 */
public interface Sender {

    public void send();
}
/**
 * 2、實現類,郵件郵寄類實現郵寄接口,實現其郵寄的方法
 * @author barnett
 *
 */
public class MailSender implements Sender {

    @Override
    public void send() {
        System.out.println("I am MailSender!");
    }
}
/**
 * 短信郵寄類實現郵寄接口,實現其郵寄方法
 * @author barnett
 *
 */
public class SmsSender implements Sender {

    @Override
    public void send() {
        System.out.println("I am SmsSender!");
    }
}
/**
 * 3、提供器接口,返回郵寄對象,其生產方法待實現
 * 工廠依靠實現該接口,生產產品(Sender)
 * @author barnett
 *
 */
public interface Provider {

    public Sender produce();

}
/**
 * 4、工廠,郵件郵寄工廠,負責專門生產郵件郵寄實例
 * @author barnett
 *
 */
public class SendMailFactory implements Provider {

    @Override
    public Sender produce() {
        return new MailSender();
    }
}
/**
 * 短信郵寄工廠,專門生產短信郵寄實例
 * @author barnett
 *
 */
public class SendSmsFactory implements Provider {

    @Override
    public Sender produce() {
        return new SmsSender();
    }
}
/**
 * 5、測試類
 * @author barnett
 *
 */
public class Test {

    public static void main(String[] args) {
        // 實例一個郵件工廠(因其實現了提供器接口,可返回一個具有專門生產某種產品生產方法的實例)
        Provider provider = new SendMailFactory();
        // 通過該實例生產產品
        Sender sender = provider.produce();
        // 調用產品的方法
        sender.send();
        // 實例生產另一種產品的工廠
        SendSmsFactory factory = new SendSmsFactory();
        Sender sender2 = factory.produce();
        sender2.send();
    }
}

三、抽象工廠模式優勢

若想生產新的產品,只需一個實現類,實現Sender接口,再創建一個專門用於生產該產品的工廠類,實現Provider接口,這樣一來,無需改動原有代碼,拓展性好

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章