国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

設計模式之簡單工廠模式

mo0n1andin / 3366人閱讀

摘要:類型創建型,但不屬于中設計模式。簡介通過一個專門的工廠類來創建其他類,這些被創建的類通常有一個共同的父類或接口。相關代碼簡單工廠模式推薦閱讀慕課網設計模式精講簡單工廠模式

0x01.定義與類型

定義:由一個工廠對象決定創建出哪一種產品類的實例。

類型:創建型,但不屬于GOF23中設計模式。

簡介:通過一個專門的工廠類來創建其他類,這些被創建的類通常有一個共同的父類或接口。

uml類圖

代碼

//產品接口
public interface IProduct {
    void produce();
}

//產品實現
public class Product implements IProduct{
    @Override
    public void produce() {
        System.out.println("產品邏輯");
    }
}

//產品工廠
public class ProductFactory {
    public static IProduct createProduct(String name) {
        Product product = null;
        if ("product".equals(name)) {
            product = new Product();
        }
        return product;
    }
}

應用或測試

public class Test {
    public static void main(String[] args) {
        IProduct product = ProductFactory.createProduct("product");
        product.produce();
    }
}

輸出結果

產品邏輯

通過簡單工廠模式,可以看到有三個要素

產品接口:產品接口的主要目的是定義產品的規范,所有的產品實現都必須遵循產品接口定義的規范。產品接口是調用者最為關心的,產品接口定義的優劣直接決定了調用者代碼的穩定性。同樣,產品接口也可以用抽象類來代替,但要注意最好不要違反里氏替換原則。

產品實現:實現產品接口的具體類,決定了產品在客戶端中的具體行為。

產品工廠:靜態方法用來生產產品,與調用者直接交互用來提供產品。一般使用靜態方法提供,注意當變更發生時,這個類違反了開閉原則。

0x02.適用場景

工廠類負責創建的對象比較少

客戶端(應用層)只知道傳入工廠類的參數,對于如何創建對象(邏輯)不關心

0x03.簡單工廠的優缺點

優點:只需要傳入一個正確的參數,就可以獲取你所需要的對象,而無須知道其創建細節

缺點:工廠類的職責相對過重,增加新的產品,需要修改工廠類的判斷邏輯,違背開閉原則

0x04.簡單工廠的實線樣例

假設IT教育課程,具有Java, Python等視頻。他們都是視頻類的子類,而有多帶帶的視頻工廠生產這些課程!

課程基類

public abstract class Video {
    public abstract void produce();
}

視頻工廠

public class VideoFactory {
    /**
     * 每次新增加產品實線會修改代碼
     * 不符合開閉原則
     * @param type
     * @return
     */
    public Video getVideo(String type) {
        if ("java".equalsIgnoreCase(type)) {
            return new JavaVideo();
        } else if ("python".equalsIgnoreCase(type)) {
            return new PythonVideo();
        } else return null;
    }

    /**
     * 反射方式實現
     * @param clazz
     * @return
     */
    public Video getVideo(Class clazz) {
        Video video = null;
        try {
            video = (Video) Class.forName(clazz.getName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return video;
    }
}

Java, Python視頻的具體實線類

public class JavaVideo extends Video {
    @Override
    public void produce() {
        System.out.println("錄制Java課程視頻");
    }
}
public class PythonVideo extends Video{
    @Override
    public void produce() {
        System.out.println("錄制Python課程");
    }
}

最后的測試類,測試視頻工廠輸出的視頻

public class Test {

//    public static void main(String[] args) {
//        Video video = new JavaVideo();
//        video.produce();
//    }

    public static void main(String[] args) {
        VideoFactory videoFactory = new VideoFactory();
        Video video1 = videoFactory.getVideo("python");
        if (video1 != null) {
            video1.produce();
        }
        Video video2 = videoFactory.getVideo("java");
        if (video2 != null) {
            video2.produce();
        }
    }

   /* public static void main(String[] args) {
        VideoFactory videoFactory = new VideoFactory();
        Video video = videoFactory.getVideo(PythonVideo.class);
        if (video != null) {
            video.produce();
        }
    }*/
}

輸出結果

錄制Python課程
錄制Java課程視頻
0x05.UML類圖

如圖uml所示:直接的應用類中并沒有于具體實現類的耦合,這樣當新增具體實現類時是不需要修改應用層業務邏輯

0x06.源碼中的簡單工廠

Calendar.createCalendar():JDK時間處理類

//根據輸入參數區分的具體實現
if (aLocale.hasExtensions()) {
    String caltype = aLocale.getUnicodeLocaleType("ca");
    if (caltype != null) {
        switch (caltype) {
        case "buddhist":
        cal = new BuddhistCalendar(zone, aLocale);
            break;
        case "japanese":
            cal = new JapaneseImperialCalendar(zone, aLocale);
            break;
        case "gregory":
            cal = new GregorianCalendar(zone, aLocale);
            break;
        }
    }
}

jdbc的Class.forname("com.mysql.driver"):通過每個db推出的不同的驅動,通過反射創建出連接。

0x07.相關代碼

簡單工廠模式:https://github.com/sigmako/design-pattern/tree/master/simple-factory

0x08.推薦閱讀

慕課網設計模式精講: https://coding.imooc.com/class/270.html

簡單工廠模式:https://blog.csdn.net/weiwenlongll/article/details/6918164

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74721.html

相關文章

  • PHP面試???em>之設計模式——工廠模式

    摘要:工廠模式其實可以劃分為簡單工廠模式工廠方法模式抽象工廠模式等。簡單工廠模式介紹簡單工廠模式又稱為靜態工廠方法模式,它屬于類創建型模式。此模式是對工廠方法模式的進一步擴展。 你好,是我琉憶,PHP程序員面試筆試系列圖書的作者。 本周(2019.3.11至3.15)的一三五更新的文章如下: 周一:PHP面試??贾O計模式——工廠模式周三:PHP面試常考之設計模式——建造者模式周五:PHP...

    Jiavan 評論0 收藏0
  • 優才公開課筆記:php設計模式 (二)工廠模式

    摘要:但本質是,簡單工廠并未嚴格遵循設計模式的開閉原則,當需要增加新產品時也需要修改工廠代碼。但是工廠方法則嚴格遵守開閉原則,模式只負責抽象工廠接口,具體工廠交給客戶去擴展。 最近開展了三次設計模式的公開課,現在來總結一下設計模式在PHP中的應用,這是第二篇創建型模式之工廠模式。 設計模式的一般介紹在第一篇文章講了,這里就不重復。 工廠模式 實現:定義一個用于創建對象的接口,讓子類決定實...

    aisuhua 評論0 收藏0
  • Java設計模式(二)——工廠模式

    摘要:需要說明的是在設計模式一書中將工廠模式分為兩類工廠方法模式與抽象工廠模式,將簡單工廠模式看為工廠方法模式的一種特例,兩者歸為一類。工廠模式的作用工廠模式的作用封裝變化創建邏輯有可能變化,封裝成工廠類之后,創建邏輯的變更對調用者透明。1、什么是工廠模式Define an interface for creating an object,but let subclasses decide whi...

    Doyle 評論0 收藏0
  • 一天一個設計模式JS實現——工廠模式

    摘要:參考文章深入理解三種工廠模式工廠模式,工廠方法模式,抽象工廠模式詳解工廠模式是中最常用的設計模式之一。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。 參考文章:深入理解java三種工廠模式工廠模式,工廠方法模式,抽象工廠模式 詳解 工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的...

    Muninn 評論0 收藏0
  • 工廠模式(一)抽象工廠模式

    摘要:主要詳解簡單工廠模式到抽象工廠模式的演變。抽象工廠模式當一個類別的產品還有多個系列區分時,為了按系列生產商品,使用抽象工廠區分。 主要詳解簡單工廠模式到抽象工廠模式的演變。 簡單工廠模式 即靜態工廠模式1.將對象的創建和使用分開;2.將生產過程集中,便于集中管理;3.當需要創建的對象類有變動時,就不用在所有new 的地方修改了,直接修改工廠類即可; /** * 簡單工廠模式 ---...

    woshicixide 評論0 收藏0
  • 設計模式系列工廠模式

    摘要:設計模式之工廠模式工廠模式包括了簡單工廠工廠方法和抽象工廠。工廠方法模式下面我們針對普通工廠模式的缺點進行優化。 設計模式之工廠模式 工廠模式包括了簡單工廠、工廠方法和抽象工廠。下面我從java實際應用的角度分別介紹這三種模式。 簡單工廠模式 下面看下JDBC中獲取Connection的代碼 public class ConnectionFactory { public Con...

    MrZONT 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<