1. 程式人生 > >Java設計模式之工廠模式

Java設計模式之工廠模式

href 1.2 net main override create 靜態工廠方法 lan soft

工廠方法模式

工廠方法模式分為三種:普通工廠模式、多個工廠方法模式和靜態工廠方法模式。

1、普通工廠模式

普通工廠模式就是建立一個工廠類,對實現了同一接口的一些類進行實例的創建。

package com.mode.create;

public interface MyInterface {
    public void print();
}

package com.mode.create;

public class MyClassOne implements MyInterface {

    @Override
    public
void print() { System.out.println("MyClassOne"); } }
package com.mode.create;

public class MyClassTwo implements MyInterface {

    @Override
    public void print() {
        System.out.println("MyClassTwo");
    }

}
package com.mode.create;

public class MyFactory {

    
public MyInterface produce(String type) { if ("One".equals(type)) { return new MyClassOne(); } else if ("Two".equals(type)) { return new MyClassTwo(); } else { System.out.println("沒有要找的類型"); return null; } } }

package com.mode.create;
public class FactoryTest {

    public static void main(String[] args){
        MyFactory factory = new MyFactory();  
        MyInterface myi = factory.produce("One");  
        myi.print();
    }

}

FactoryTest的運行結果我想應該很明顯了。

再回頭來理解這句話:普通工廠模式就是建立一個工廠類,對實現了同一接口的一些類進行實例的創建。

3.1.2、多個工廠方法模式

多個工廠方法模式,是對普通工廠方法模式的改進,多個工廠方法模式就是提供多個工廠方法,分別創建對象。

直接看代碼吧,我們修改MyFactory和FactoryTest如下:

package com.mode.create;

public class MyFactory {

    public MyInterface produceOne() {
        return new MyClassOne();
    }

    public MyInterface produceTwo() {
        return new MyClassTwo();
    }

}

package com.mode.create;

public class FactoryTest {

    public static void main(String[] args){
        MyFactory factory = new MyFactory();  
        MyInterface myi = factory.produceOne();
        myi.print();
    }

}

運行結果也是十分明顯了。

再回頭來理解這句話:多個工廠方法模式,是對普通工廠方法模式的改進,多個工廠方法模式就是提供多個工廠方法,分別創建對象。

3.1.3、靜態工廠方法模式

靜態工廠方法模式,將上面的多個工廠方法模式裏的方法置為靜態的,不需要創建實例,直接調用即可。

直接看代碼吧,我們修改MyFactory和FactoryTest如下:

package com.mode.create;

public class MyFactory {

    public static MyInterface produceOne() {
        return new MyClassOne();
    }

    public static MyInterface produceTwo() {
        return new MyClassTwo();
    }

}

package com.mode.create;

public class FactoryTest {

    public static void main(String[] args){ 
        MyInterface myi = MyFactory.produceOne();
        myi.print();
    }

}

運行結果依舊很明顯。

再回顧:靜態工廠方法模式,將上面的多個工廠方法模式裏的方法置為靜態的,不需要創建實例,直接調用即可。

3.2、抽象工廠模式

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

為解決這個問題,我們來看看抽象工廠模式:創建多個工廠類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的代碼。

這樣就符合閉包原則了。

下面來看看代碼:

MyInterface、MyClassOne、MyClassTwo不變。

新增如下接口和類:

package com.mode.create;

public interface Provider {
    public MyInterface produce(); 
}

package com.mode.create;

public class MyFactoryOne implements Provider {

    @Override
    public MyInterface produce() {
        return new MyClassOne();
    }

}
package com.mode.create;

public class MyFactoryTwo implements Provider {

    @Override
    public MyInterface produce() {
        return new MyClassTwo();
    }

}

修改測試類FactoryTest如下:

package com.mode.create;

public class FactoryTest {

    public static void main(String[] args){ 
        Provider provider = new MyFactoryOne();
        MyInterface myi = provider.produce();
        myi.print();
    }

}

運行結果依舊顯然。

再回顧:抽象工廠模式就是創建多個工廠類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的代碼。

參考:Java經典設計模式之五大創建型模式(附實例和詳解)

Java設計模式之工廠模式