工廠設計模式與代理設計模式【帶樣例】

Chaim16發表於2020-11-18

工廠設計模式

先來看看一個程式碼:

/** 食物介面 */
interface IFood{
    public void eat();
}

/** 米飯類,實現食物介面 */
class Rice implements IFood{

    @Override
    public void eat() {
        System.out.println("吃米飯咯!");
    }
}

public class Main {
    public static void main(String[] args) {
        IFood ifood = new Rice();
        ifood.eat();
    }
}

很簡單的一段程式碼

但是客戶端要明確知道具體的哪一個子類,如果說現在吃膩了米飯,改吃麵條了,那麼客戶端就要做出修改

如下:

這種問題稱之為“耦合問題”,是因為關鍵字“new ”造成了耦合問題

如何解決?

工廠(factory)設計實現

觀察程式碼:

/** 食物介面 */
interface IFood{
    public void eat();
}

/** 米飯類,實現食物介面 */
class Rice implements IFood{

    @Override
    public void eat() {
        System.out.println("吃米飯咯!");
    }
}

/** 麵條類 */
class Noodle implements IFood{

    @Override
    public void eat() {
        System.out.println("吃麵條咯!");
    }
}

/** 工廠設計 */
class Factory{
    public IFood getDemo(String className){
        if("rice".equals(className)){
            return new Rice();
        }
        if("noodle".equals(className)){
            return new Noodle();
        }
        return null;
    }
}

public class Main {
    public static void main(String[] args) {
        Factory factory = new Factory();
        IFood food = factory.getDemo("noodle");
        food.eat();
    }
}

輸出結果:

這樣我們就成功地改吃麵條了


翻篇了

代理設計模式(proxy):

作用:幫助使用者將所有的開發注意力只集中在核心業務功能的

例如,肚子餓了,就只關注吃東西,不管吃啥

觀察程式碼:

/** 吃介面 */
interface IEat{
    public void get();
}

/** 代理設計 */
class eatProxy implements IEat{
    private IEat eat;

    /** 構造方法 */
    public eatProxy(IEat eat){
        this.eat = eat;
    }

    @Override
    public void get() {
        this.prepare();
        this.eat.get();
        this.clear();
    }

    /** 前期準備 */
    public void prepare(){
        System.out.println("【代理主題】:正在為您準備食材!");
        System.out.println("【代理主題】:正在做菜!");
    }

    /** 後期收拾 */
    public void clear(){
        System.out.println("【代理主題】:正在收拾碗筷!");
    }

}

/** 吃 */
class Eat implements IEat{

    @Override
    public void get() {
        System.out.println("【真實主題】:得到了一頓飯!");
    }
}

public class Main {
    public static void main(String[] args) {
        IEat iEat = new eatProxy(new Eat());
        iEat.get();
    }
}

執行結果:

我們可以發現,

代理設計模式的主要特點是:一個介面提供有兩個子類,其中一個是真實的業務操作子類(只管吃),另一個是負責其他服務的代理子類(做飯、洗碗操作),真實業務在代理業務上進行,沒有代理業務,真實業務無法進行


程式碼編譯器:IntelliJ IDEA 2020.02

相關文章