1. 程式人生 > >設計模式之工廠模式(工廠方法模式、簡單工廠模式、抽象工廠模式)

設計模式之工廠模式(工廠方法模式、簡單工廠模式、抽象工廠模式)

工廠模式

工廠模式是最常用的設計模式之一,這種型別的設計模式屬於建立設計模式,它提供了一種建立物件的最佳方式。

優點:1、一個呼叫者想建立一個物件,只要知道其名稱就可以了。 2、擴充套件性高,如果想要增加多一個產品,只要擴充套件一個工廠類就可以了。 3、隱蔽產品的具體實現,呼叫者只要關係產品的介面。

程式碼編寫出來是為了給別人 (client) 呼叫的:

 •  呼叫者 (client) 跟程式碼編寫者 (provider),可能是同一個人,也可能是不同的人

 •  提供給呼叫者的程式碼,有可能是原始碼可見的,也可能是原始碼不可見、不可修改的(比如 jar 包)

所以,為了簡化程式碼的協作使用及管理維護,必須想盡辦法簡化程式碼邏輯,實現必要的分離

 

一、工廠方法模式

為 Phone 工廠建立一個介面:

/**
 * 工廠類的基類(介面類)
 */
public interface phoneFactory {

    phone createPhone();
}

如果想增加一款產品,比如 iPhone 手機,只需要為 iPhone 手機增加一個工廠類就可以了:

/**
 * iPhone 手機工廠類
 */
public class IphoneFactory implements phoneFactory {

    @Override
    public phone createPhone(){
        
return new iPhone(); } }

如果還想增加一個 vivo 手機,還是增加一個相對的工廠類就可以了:

/**
 * vivo 手機工廠類
 */
public class VivoFactory implements phoneFactory {

    @Override
    public phone createPhone(){
        return new Vivo();
    }
}

客戶端呼叫:

        // 蘋果手機的工廠類
        phoneFactory Factory1 = new IphoneFactory();
        Factory1.createPhone();

        
// vido 手機的工廠類 phoneFactory Factory2 = new VivoFactory(); Factory2.createPhone();

 

二、簡單工廠模式

步驟一:建立一個介面類:

/**
 * 所有手機基類(介面類)
 */
public interface phone {
    void play();
}

步驟二:建立實體類,實現介面的 play() 方法:

/**
 * 華為手機實體類
 */
public class Huawei implements phone {

    @Override
    public void play() {
        System.out.println("玩華為手機");
    }
}
/**
 * 小米手機實體類
 */
public class Mi implements phone {

    @Override
    public void play() {
        System.out.println("玩小米MIX2");
    }
}

步驟三:工廠類

/**
 * 簡單工廠類
 */
public class PhoneFactory {

    public phone createPhone1(String tag) {
        if (tag.equals("pg")) {
            return new iPhone();
        } else if (tag.equals("hw")) {
            return new Huawei();
        }
        return null;
    }
}

三、抽象工廠模式

步驟一:建立一個工廠介面

/**
 * 工廠類的基類(介面類)
 */
public interface phoneFactory {
    
    phone createPhone(phone p);
    usb createUSB();
    charger createCharger();
}

步驟二:實現工廠介面的方法,去呼叫封裝好的手機類

/**
 * 華為手機工廠類(實現工廠介面的方法)
 */
public class HuaweiPhoneFactory implements phoneFactory {
    phone createPhone() {
        return new HuaweiPhone();
    }
    usb createUSB() {
        return new HuaweiUSB();
    }
    charger createCharger() {
        return new HuaweiCharger();
    }
}

步驟五:客戶端的呼叫

    public static void main(String[] args) {

        // 這是一個華為手機的工廠類,實現了小米手機的方法
        phoneFactory factory = new HuaweiFactory();
        pf.createPhone();
        pf.createUsb();
        pf.createCharger();
    }