我通過三個故事終於學明白了三種工廠模式

介紹

我認爲把知識給別人講會,講明白,自己才徹底明白。
努力把文章寫好,寫明白每一篇文章,分享給更多人。
一個贊、一個評論、一個關注,真的好開心,努力沒有白費,得到了這麼多人的認可。

一、簡單工廠模式

介紹:

  • 1、簡單工廠模式是屬於創建型模式,是工廠模式的一種。簡單工廠模式是由一個工廠對象決定創建出哪個一種實體類的實例。簡單工廠模式是工廠模式家族中最簡單使用的模式。
  • 2、簡單工廠模式:定義了一個創建對象的類,由這個類來封裝實例化對象的行爲
  • 3、在軟件開發中,當我們會使用到大量的創建某種、某類或者某批對象時,就會使用到工廠模式。

大白話說:

你想要什麼,告訴我,我給你就是了。

用出行的方式來舉例子說明簡單工廠模式。

假設人們需要出行時可以騎自行車,可以走路,可以坐公交,可以開私家車,還可以火車和飛機,當然了未來說不定還有飛船之類的。那麼我們急用簡單工廠模式來實現這個出行的功能:

(一)創建抽象出行類

package factory.simplefactory.goOut;
/**
 * @Auther: truedei
 * @Date: 2020 /20-4-26 22:49
 * @Description:
 */
public abstract class GoOut {
    //只是一個抽象的方法,具體的功能實現讓交通工具去實現
    public abstract void run();
}

(二)創建出行方式具體實現類

(1)步行

package factory.simplefactory.goOut;

/**
 * @Auther: truedei
 * @Date: 2020 /20-4-26 22:51
 * @Description: 步行
 */
public class Walk extends GoOut{
    @Override
    public void run() {
        System.out.println("步行");
    }
}

(2)騎自行車

package factory.simplefactory.goOut;

/**
 * @Auther: truedei
 * @Date: 2020 /20-4-26 22:53
 * @Description: 騎自行車
 */
public class Bike extends GoOut{
    @Override
    public void run() {
        System.out.println("騎自行車");
    }
}

(3)開汽車

package factory.simplefactory.goOut;

/**
 * @Auther: truedei
 * @Date: 2020 /20-4-26 22:53
 * @Description:開汽車
 */
public class Car extends GoOut {
    @Override
    public void run() {
        System.out.println("開汽車");
    }
}

(三)創建工廠類

接下來創建一個工廠類,功能是提供給用戶的出行的方式,用戶只需要告訴工廠類他需要什麼方式就好了。

package factory.simplefactory.goOut;

/**
 * @Auther: truedei
 * @Date: 2020 /20-4-26 22:58
 * @Description:爲用戶提供選擇出行的方式。
 */
public class GoOutFactory {

    public static GoOut  createGoOut(String goOutType){
        GoOut goOut = null;

        switch (goOutType){
            case "walk":
                goOut = new Walk();
                break;
            case "bike":
                goOut = new Bike();
                break;
            case "car":
                goOut = new Car();
                break;
        }

        return goOut;
    }

}

(四)創建客戶端測試

package factory.simplefactory.goOut;

/**
 * @Auther: truedei
 * @Date: 2020 /20-4-26 23:03
 * @Description:測試類
 */
public class TestGoOut {
    public static void main(String[] args) {
        GoOutFactory.createGoOut("car").run();
        GoOutFactory.createGoOut("walk").run();
        GoOutFactory.createGoOut("bike").run();
    }
}

測試結果:

開汽車
步行
騎自行車

Process finished with exit code 0

防爬蟲,看到請忽略
文章作者:TrueDei
作者博客首頁:http://truedei.blog.csdn.net
文章原文地址:https://truedei.blog.csdn.net/article/details/105822946

二、工廠方法模式

(一)介紹

工廠方法模式:定義了一個用於創建對象的接口,讓子類決定要實例化的類。工廠方法模式將一個類的實例化延遲倒子類。

(二)看一下需求,需求如下

有一個看書的程序,最初只有Python書。但是呢隨着發展,也會有越來越多的書。

(三)沒有使用工廠方法的代碼

package factory.Product;

/**
 * @Auther: truedei
 * @Date: 2020 /20-4-28 09:02
 * @Description:
 */
public class FactoryMethod {
    public static void main(String[] args) {
        Application application = new Application();
        ProductPython ogject = application.getOgject();
        ogject.method();
    }
}

class ProductPython{
    public void method(){
        System.out.println("這是Python的產品類的方法");
    }
}

class Application{

    private ProductPython createProduct(){
        return new ProductPython();
    }

    ProductPython getOgject(){
        ProductPython product = createProduct();

        return product;
    }

}


(四)使用工廠方法模式進行重構

爲了公司業務的發展需求,可以使用工廠方法模式進行代碼的重構。

/**
 * @Auther: truedei
 * @Date: 2020 /20-4-28 09:02
 * @Description:
 */
public class FactoryMethod {
    public static void main(String[] args) {
        Application application = new CreateProductPython();
        Product python = application.getObject();
        python.method();

        Application application1 = new CreateProductJava();
        Product java = application1.getObject();
        java.method();
    }
}

//1、把公共的、穩定的方法給抽象出來
interface Product{
    public void method();
}


class ProductPython implements Product{

    public void method(){
        System.out.println("這是Python的產品類的方法");
    }
}

class ProductJava implements Product{

    public void method(){
        System.out.println("這是Java的產品類的方法");
    }
}

class SimpleFactory{
    public static Product createProduct(String bookType){

        if(bookType.equals("python")){
            return new ProductPython();
        }else if(bookType.equals("Java")){
            return new ProductJava();
        }else {
            return null;
        }

    }
}

abstract class Application{

    abstract Product createProduct();

    Product getObject(){
        Product product = createProduct();
        return product;
    }

}


class CreateProductPython extends Application{

    @Override
    Product createProduct() {
        return new ProductPython();
    }
}

class CreateProductJava extends Application{
    @Override
    Product createProduct() {
        return new ProductJava();
    }
}

(五)使用場景

  • 1、在不知道該使用對象的準確類型的時候
  • 2、爲方便擴展組件的時候

(六)主要優點

  • 1、將具體產品和創造者解耦
  • 2、符合單一職責原則
  • 3、符合開閉原則

防爬蟲,看到請忽略
文章作者:TrueDei
作者博客首頁:http://truedei.blog.csdn.net
文章原文地址:https://truedei.blog.csdn.net/article/details/105822946

三、抽象工廠模式

(一)介紹

提供一個創建一系列相關或互相依賴對象的接口,而無需指定它們具體的類。

(二)實例需求說明

開發一個數據庫的組件。

可以看到針對的是數據庫,那麼數據庫又有很多種類的數據庫,例如:Mysql,Oracle等。

共性:

1、連接數據

2、執行數據庫命令

3、等等…

(三)實現代碼

package factory.abstractFactory;

/**
 * @Auther: truedei
 * @Date: 2020 /20-4-28 18:00
 * @Description:抽象工廠模式
 */
public class AbstractFactoryTest {
    public static void main(String[] args) {
        TrueDeiDatabaseUtils tdbu = new MysqlDataBaseUtils();
        TrueDeiConnection connection = tdbu.getConnection();
        connection.connect();//連接數據庫

        TrueDeiCommand command = tdbu.getCommand();
        command.command();//發送命令


        TrueDeiDatabaseUtils Otdbu = new MysqlDataBaseUtils();
        TrueDeiConnection Oconnection = Otdbu.getConnection();
        Oconnection.connect();//連接數據庫

        TrueDeiCommand Ocommand = tdbu.getCommand();
        Ocommand.command();//發送命令

    }
}

//抽象連接數據庫的類
interface TrueDeiConnection{
    public void connect();
}
//抽象關閉數據庫連接的類
interface TrueDeiCommand{
    public void command();
}
//工具類
interface TrueDeiDatabaseUtils{
    //連接數據庫
    TrueDeiConnection getConnection();

    //發送命令
    TrueDeiCommand getCommand();
}

//實現Mysql的連接實例
class MysqlConnection implements TrueDeiConnection{

    @Override
    public void connect() {
        System.out.println("連接mysql數據庫");
    }
}

//實現Mysql的發送命令的實例
class MysqlCommand implements TrueDeiCommand{

    @Override
    public void command() {
        System.out.println("向mysql數據庫發送命令");
    }
}


//實現Mysql的工具類  有一組接口的是工廠模式,一個接口的是工廠方法模式
class MysqlDataBaseUtils implements TrueDeiDatabaseUtils{
    @Override
    public TrueDeiConnection getConnection() {
        return new MysqlConnection();
    }

    @Override
    public TrueDeiCommand getCommand() {
        return new MysqlCommand();
    }
}



//實現Mysql的連接實例
class OracleConnection implements TrueDeiConnection{

    @Override
    public void connect() {
        System.out.println("連接Oracle數據庫");
    }
}

//實現Oracle的發送命令的實例
class OracleCommand implements TrueDeiCommand{

    @Override
    public void command() {
        System.out.println("向Oracle數據庫發送命令");
    }
}


//實現Oracle的工具類
class OracleDataBaseUtils implements TrueDeiDatabaseUtils{
    @Override
    public TrueDeiConnection getConnection() {
        return new OracleConnection();
    }

    @Override
    public TrueDeiCommand getCommand() {
        return new OracleCommand();
    }
}

測試結果:

連接mysql數據庫
向mysql數據庫發送命令
連接mysql數據庫
向mysql數據庫發送命令

(四)應用場景

程序需要處理不同系列的相關產品,但是您不希望它依賴於這些產品的具體類時,可以使用抽象工廠。

(五)優點

  • 1、可以確信從工廠得到的產品彼此是兼容的;
  • 2、可以避免具體產品和客戶端代碼之間的緊密耦合;
  • 3、符合單一職責原則;
  • 4、符合開閉原則(當新增一個功能時,不需要去修改之前的)。

(六)在源碼中的應用

像連接數據庫的jdbc的接口(Connection)等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章