黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 職業指南 大家一直都在找的Java工廠模式面試題

大家一直都在找的Java工廠模式面試題

更新時間:2023-01-29 17:06:38 來源:動力節點 瀏覽1354次

一.簡單(靜態)工廠模式

1,首先建立一個產品的抽象類

需要生產什么產品(實例對象)就需要首先建立一個相應產品的抽象類

class="hljs java has-numbering">class="hljs-keyword">public class="hljs-keyword">abstract class="hljs-class">class="hljs-keyword">class class="hljs-title">INoodles {
    class="hljs-javadoc">/**
     * 描述每種面條啥樣的
     */
    class="hljs-keyword">public class="hljs-keyword">abstract class="hljs-keyword">void class="hljs-title">desc();
}

2.再建立幾種具體的產品類如:

這里建立了三個產品類:蘭州拉面,泡面,干扣面(沒吃過)

class="hljs java has-numbering">class="hljs-keyword">public class="hljs-class">class="hljs-keyword">class class="hljs-title">LzNoodles class="hljs-keyword">extends class="hljs-title">INoodles {
    class="hljs-annotation">@Override
    class="hljs-keyword">public class="hljs-keyword">void class="hljs-title">desc() {
        System.out.println(class="hljs-string">"蘭州拉面");
    }
}
class="hljs java has-numbering">class="hljs-keyword">public class="hljs-class">class="hljs-keyword">class class="hljs-title">PaoNoodles class="hljs-keyword">extends class="hljs-title">INoodles {
    class="hljs-annotation">@Override
    class="hljs-keyword">public class="hljs-keyword">void class="hljs-title">desc() {
        System.out.println(class="hljs-string">"泡面");
    }
}
class="hljs java has-numbering">class="hljs-keyword">public class="hljs-class">class="hljs-keyword">class class="hljs-title">GankouNoodles class="hljs-keyword">extends class="hljs-title">INoodles {
    class="hljs-annotation">@Override
    class="hljs-keyword">public class="hljs-keyword">void class="hljs-title">desc() {
        System.out.println(class="hljs-string">"干扣面");
    }
}

3.在建立完這些產品后就可以建立(造面的)工廠了:

工廠里面包含了我們可以生產的產品(面)

class="hljs java has-numbering">class="hljs-keyword">public class="hljs-class">class="hljs-keyword">class class="hljs-title">SimpleNoodlesFactory {
    class="hljs-keyword">public class="hljs-keyword">static class="hljs-keyword">final class="hljs-keyword">int TYPE_LZ = class="hljs-number">1;class="hljs-comment">//蘭州拉面
    class="hljs-keyword">public class="hljs-keyword">static class="hljs-keyword">final class="hljs-keyword">int TYPE_PM = class="hljs-number">2;class="hljs-comment">//泡面
    class="hljs-keyword">public class="hljs-keyword">static class="hljs-keyword">final class="hljs-keyword">int TYPE_GK = class="hljs-number">3;class="hljs-comment">//干扣面

    class="hljs-keyword">public class="hljs-keyword">static INoodles class="hljs-title">createNoodles(class="hljs-keyword">int type) {
        class="hljs-keyword">switch (type) {
            class="hljs-keyword">case TYPE_LZ:
                class="hljs-keyword">return class="hljs-keyword">new LzNoodles();
            class="hljs-keyword">case TYPE_PM:
                class="hljs-keyword">return class="hljs-keyword">new PaoNoodles();
            class="hljs-keyword">case TYPE_GK:
            class="hljs-keyword">default:
                class="hljs-keyword">return class="hljs-keyword">new GankouNoodles();
        }
    }
}

4.開始根據客人的要求生產產品

如下代碼是生產干扣面(真心不知道這名字是怎么來的)的過程。

INoodles noodles = SimpleNoodlesFactory.createNoodles(SimpleNoodlesFactory.TYPE_GK);
 noodles.desc();

該設計模式只可以生產工廠能生產的產品,如需要增加產品,需要在工廠類中增加相應的靜態變量。

特點

1 它是一個具體的類,非接口 抽象類。有一個重要的create()方法,利用if或者 switch創建產品并返回。

2 create()方法通常是靜態的,所以也稱之為靜態工廠。

缺點

1 擴展性差(我想增加一種面條,除了新增一個面條產品類,還需要修改工廠類方法)

2 不同的產品需要不同額外參數的時候 不支持。

二、另一種簡單工廠(反射):

利用反射Class.forName(clz.getName()).newInstance()實現的簡單工廠:

class="hljs java has-numbering">class="hljs-keyword">public class="hljs-class">class="hljs-keyword">class class="hljs-title">StaticNoodlesFactory {
    class="hljs-javadoc">/**
     * 傳入Class實例化面條產品類
     *
     *class="hljs-javadoctag"> @param clz
     *class="hljs-javadoctag"> @param <T>
     *class="hljs-javadoctag"> @return
     */
    class="hljs-keyword">public class="hljs-keyword">static <T extends INoodles> T class="hljs-title">createNoodles(Class<T> clz) {
        T result = class="hljs-keyword">null;
        class="hljs-keyword">try {
            result = (T) Class.forName(clz.getName()).newInstance();
        } class="hljs-keyword">catch (Exception e) {
            e.printStackTrace();
        }
        class="hljs-keyword">return result;
    }
}

特點

1.它也是一個具體的類,非接口 抽象類。但它的create()方法,是利用反射機制生成對象返回,好處是增加一種產品時,不需要修改create()的代碼。

缺點

這種寫法粗看牛逼,細想之下,不談reflection的效率還有以下問題:

1.個人覺得不好,因為Class.forName(clz.getName()).newInstance()調用的是無參構造函數生成對象,它和new Object()是一樣的性質,而工廠方法應該用于復雜對象的初始化 ,當需要調用有參的構造函數時便無能為力了,這樣像為了工廠而工廠。

2.不同的產品需要不同額外參數的時候 不支持

以上就是“大家一直都在找的Java工廠模式面試題”,你能回答上來嗎?如果想要了解更多的Java面試題相關內容,可以關注動力節點Java官網。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 曰批免费视频播放免费观看网站 | 一级片麻豆 | 国产99视频精品免费视频7 | 日本欧洲亚洲一区在线观看 | 日本激情在线看免费观看视频 | 日韩欧美视频在线一区二区 | 丁香五月欧美成人 | 120秒免费 | 狠狠操免费视频 | 欧美色图888 | 91精品久久久久久久久中文字幕 | 亚洲日本中文字幕永久 | 日韩在线第一区 | jizzjizz亚洲女人 | 天天看片日日夜夜 | 在线天堂中文在线资源网 | 99热在线观看精品 | 欧美大黄| 天天操操操操操 | 国产日韩亚洲欧洲一区二区三区 | 老司机成人午夜精品福利视频 | 一级黄色片中国 | 午夜影院一级片 | 国产伦久视频免费观看 视频 | 91久久精品国产一区二区 | 中文字幕一区二区三区在线不卡 | 国产亚洲综合成人91精品 | 亚洲欧美强伦一区二区另类 | 亚洲一区二区三区香蕉 | 国产 在线 | 日韩 | 亚洲精品网站在线观看不卡无广告 | 韩国伦理片在线观看 | 色噜噜狠狠狠狠色综合久不 | 999久久久免费精品国产牛牛 | 日本高清中文字幕视频在线 | 老人与老人免费a级毛片 | 日韩大片在线观看 | 一级一片一_级一片一 | 成人免费观看黄a大片夜月 成人免费观看www视频 | 99精品视频在线在线视频观看 | 伊人中文字幕在线 |