1. 程式人生 > >【設計模式】簡單工廠模式和工廠方法模式

【設計模式】簡單工廠模式和工廠方法模式

產生 for plm nbsp osc rbm play stp mage

> 簡單工廠模式

顧名思義,此模式的設計結構是簡單的,核心是生產對象。

一般來說,運用工廠模式生產的對象應該是構建對象的過程比較復雜的,獲取構建對象的過程在日後可能發生變更的。

簡單工廠模式,在工廠類中直接生產對象,即工廠類中直接依賴對象類。

代碼見:

https://github.com/nicchagil/design-pattern-exercise-with-java/tree/master/簡單工廠模式

> 工廠方法模式

使用簡單工廠模式,

假如有一天,Factory生產的Dog對象要全部切換為Wolf(狼),那麽我們在Factory的產生方法中修改邏輯即可。(此假設場景是全部哦,既然要將產生Dog變更為產生Wolf,那麽修改代碼邏輯無可厚非)

假如有一天,某些客戶端原來使用Cat對象的地方,需要使用Dog對象,這需要在客戶端修改代碼。(這也不是用工廠方法模式能解決的)

最後,假如有一天,需要添加生產一個Duck(鴨),那麽難道要修改Factory?如果我們的生產方法寫出如下,那麽修改的代碼量會更多,而且改起來容易錯。

技術分享
    public static Animal getInstance(String type) {
        if (type == null || type.trim().length() == 0) {
            return null;
        }
        
        
if (type.equals("dog")) { return new Dog(); } else if (type.equals("cat")) { return new Cat(); } return null; }
View Code

那麽,如果,我們使用工廠方法模式,只需要增加幾個類,就可完成增加Duck的類型。

實體類如“簡單工廠模式”,省略。

技術分享
package No002工廠方式模式;

import
No002工廠方式模式.model.Animal; public interface IFactory { public Animal getInstance(); }
View Code

技術分享
package No002工廠方式模式;

import No002工廠方式模式.model.Animal;
import No002工廠方式模式.model.Dog;

public class DogFactory implements IFactory {

    public Animal getInstance() {
        return new Dog();
    }

}
View Code

技術分享
package No002工廠方式模式;

import No002工廠方式模式.model.Animal;
import No002工廠方式模式.model.Cat;

public class CatFactory implements IFactory {

    public Animal getInstance() {
        return new Cat();
    }

}
View Code

技術分享
package No002工廠方式模式;

public class Call {

    public static void main(String[] args) {
        IFactory f = new DogFactory();
        System.out.println(f.getInstance());
        
        IFactory ff = new CatFactory();
        System.out.println(ff.getInstance());
    }

}
View Code

其類圖是這樣的:

技術分享

【設計模式】簡單工廠模式和工廠方法模式