1. 程式人生 > >創造型模式-工廠模式1

創造型模式-工廠模式1

sound 接受 模板 ring 根據 tro back 很多 部分

創造型模式分類:

  • 對象創造型模式:主要完成對象的創建,並將對象中部分內容放到其他對象中創建。
  • 類創造型模式:主要完成類實例化,並將類中的部分對象放到子類中創建(高效的利用繼承機制)
  • 抽象工廠模式:提供一個用於創建相關對象或者相互依賴對象的接口,無需指定對象的具體類
  • 生成器模式:將復雜對象的構建與其表示相互分離,使得在同樣的構建過程中可以創建不同的對象。
  • 原型模式:使用一個原型實例來指定創建對象的種類,然後通過拷貝原型實現對象的創建。
  • 單例模式:確保某一個類在系統中只有一個實例,並提供一個訪問他的全局訪問點。

工廠方法模式示例:日誌記錄在軟件應用系統中是最常用的任務。很多不同的功能模塊,可能都需要日誌的存儲功能。比如文件存取日誌,數據庫記錄日誌,控制臺記錄日誌。所有這些模塊可以通過一個接口和一個具體的實現類來完成。然後我們可以根據不同模塊所需要的不同功能,我們可以創建特定的日誌記錄對象並實現相關的功能。

工廠方法模式應用方法:假設我們首先需要定義一個用於實現某一個基本功能的超類和接口(產品類);並以此擴展出一組類(具體產品類)。之後我們創建一個用於創建產品類的類(工廠類),這個類包含著一個工廠的方法(這個方法可以接受一個參數或者多個參數)。

工廠方法的作用就是根據傳遞的參數決定創建哪一個子類完成實例化。

工廠方法模式代碼實現:

產品類

package create.factory;

/**
 * 實例化工廠類模式基類(產品類)
 * Created by admin on 2018/11/26.
 */
public interface Pet {

    public String petSound();

}

【具體產品類】

package create.factory;

/**
 * 具體產品類
 * Created by admin on 2018/11/26.
 */
public class Dog implements Pet {

    public String petSound() {
        return "旺旺";
    }
}

package create.factory;

/**
 * Created by admin on 2018/11/26.
 */
public class Cat implements Pet{

    public String petSound() {
        
return "喵喵"; } }

【工廠模板類】

package create.factory;

/**
 * 工廠方法模式實現,並展示對象創建邏輯
 * Created by admin on 2018/11/26.
 */
public class PetFactory {

    public Pet getPet(String petType){
        Pet pet = null;
        if ("Bow".equals(petType)) {
            pet = new Dog();
        } else if ("Meaw".equals(petType)) {
            pet = new Cat();
        }
        return pet;
    }

}

【測試類】

package create.factory;

/**
 * Created by admin on 2018/11/26.
 */
public class SampleFactoryMethod {

    public static void main(String[] args) {
        PetFactory petFactory = new PetFactory();
        Pet bow = petFactory.getPet("Bow");
        System.out.println(bow.petSound());
    }
}

工廠模式應用的場景:

當需要創建一個類的時候,而在編程的時候不知道這個類的類型(需要運行的時候才能確定)

當一個類希望由其子類來指定所創建對象的具體類型的時候。

當我們想要定位被創建類,並獲取相關信息時候。

示例:日誌記錄功能

package create.factory2;

/**
 * Created by admin on 2018/11/26.
 */
public class LoggerFactoryTest {

    public static void main(String[] args) {
        LoggerFactory factory = new LoggerFactory();
        AppLogger appLogger = factory.getLogger(1);
        appLogger.log("asda");
    }

}

package create.factory2;

/**
 * Created by admin on 2018/11/26.
 */
public class LoggerFactory {

    //工廠方法
    public AppLogger getLogger(int value){
        if (value == 1) {
            return new FileLogger();
        } else if(value == 2){
            return new DatabaseLogger();
        } else if (value == 3) {
            return new ConsoleLogger();
        }
        return null;
    }

}


package create.factory2;

/**
 * Created by admin on 2018/11/26.
 */
public class FileLogger implements AppLogger {

    public void log(String logMsg) {
        System.out.println("日誌記錄文件中");
    }
}


package create.factory2;

/**
 * Created by admin on 2018/11/26.
 */
public class DatabaseLogger implements AppLogger{

    public void log(String logMsg) {
        System.out.println("日誌記錄數據庫中");
    }
}



package create.factory2;

/**
 * Created by admin on 2018/11/26.
 */
public class ConsoleLogger implements AppLogger{

    public void log(String logMsg) {
        System.out.println("日誌記錄控制臺");
    }
}


package create.factory2;

/**
 * 日誌記錄器接口
 * Created by admin on 2018/11/26.
 */
public interface AppLogger {

    public void log(String logMsg);

}

創造型模式-工廠模式1