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

專(zhuān)注Java教育14年 全國(guó)咨詢(xún)/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) 學(xué)習(xí)攻略 職業(yè)指南 大家一直都在找的Java工廠模式面試題

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

更新時(shí)間:2023-01-29 17:06:38 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1509次

一.簡(jiǎn)單(靜態(tài))工廠模式

1,首先建立一個(gè)產(chǎn)品的抽象類(lèi)

需要生產(chǎn)什么產(chǎn)品(實(shí)例對(duì)象)就需要首先建立一個(gè)相應(yīng)產(chǎn)品的抽象類(lèi)

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.再建立幾種具體的產(chǎn)品類(lèi)如:

這里建立了三個(gè)產(chǎn)品類(lèi):蘭州拉面,泡面,干扣面(沒(méi)吃過(guò))

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.在建立完這些產(chǎn)品后就可以建立(造面的)工廠了:

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

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.開(kāi)始根據(jù)客人的要求生產(chǎn)產(chǎn)品

如下代碼是生產(chǎn)干扣面(真心不知道這名字是怎么來(lái)的)的過(guò)程。

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

該設(shè)計(jì)模式只可以生產(chǎn)工廠能生產(chǎn)的產(chǎn)品,如需要增加產(chǎn)品,需要在工廠類(lèi)中增加相應(yīng)的靜態(tài)變量。

特點(diǎn)

1 它是一個(gè)具體的類(lèi),非接口 抽象類(lèi)。有一個(gè)重要的create()方法,利用if或者 switch創(chuàng)建產(chǎn)品并返回。

2 create()方法通常是靜態(tài)的,所以也稱(chēng)之為靜態(tài)工廠。

缺點(diǎn)

1 擴(kuò)展性差(我想增加一種面條,除了新增一個(gè)面條產(chǎn)品類(lèi),還需要修改工廠類(lèi)方法)

2 不同的產(chǎn)品需要不同額外參數(shù)的時(shí)候 不支持。

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

利用反射Class.forName(clz.getName()).newInstance()實(shí)現(xiàn)的簡(jiǎn)單工廠:

class="hljs java has-numbering">class="hljs-keyword">public class="hljs-class">class="hljs-keyword">class class="hljs-title">StaticNoodlesFactory {
    class="hljs-javadoc">/**
     * 傳入Class實(shí)例化面條產(chǎn)品類(lèi)
     *
     *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;
    }
}

特點(diǎn)

1.它也是一個(gè)具體的類(lèi),非接口 抽象類(lèi)。但它的create()方法,是利用反射機(jī)制生成對(duì)象返回,好處是增加一種產(chǎn)品時(shí),不需要修改create()的代碼。

缺點(diǎn)

這種寫(xiě)法粗看牛逼,細(xì)想之下,不談reflection的效率還有以下問(wèn)題:

1.個(gè)人覺(jué)得不好,因?yàn)镃lass.forName(clz.getName()).newInstance()調(diào)用的是無(wú)參構(gòu)造函數(shù)生成對(duì)象,它和new Object()是一樣的性質(zhì),而工廠方法應(yīng)該用于復(fù)雜對(duì)象的初始化 ,當(dāng)需要調(diào)用有參的構(gòu)造函數(shù)時(shí)便無(wú)能為力了,這樣像為了工廠而工廠。

2.不同的產(chǎn)品需要不同額外參數(shù)的時(shí)候 不支持

以上就是“大家一直都在找的Java工廠模式面試題”,你能回答上來(lái)嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動(dòng)力節(jié)點(diǎn)Java官網(wǎng)。

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 青青青青久久精品国产h | 一级做a爰片久久毛片人呢 一级做a爰片久久毛片免费看 | 日本欧美国产精品第一页久久 | 噜噜噜噜私人影院av线观看 | 成人网18免费网站 | 久久精品国产大片免费观看 | 五月香福利 | 成人午夜动漫在线观看 | 欧美日韩高清观看一区二区 | 澳门一级毛片手机在线看 | 日韩精品视频一区二区三区 | 国产日韩三级 | 国产精品久久久久久影视 | 欧美亚洲另类在线 | 色视频大全| 日本一区免费 | 日韩区在线观看 | 成年视频在线观看 | 免费观看60秒做受视频 | 综合网久久 | 久久综合中文字幕一区二区 | 黄漫画黄网站在线观看 | 日日做日日摸夜夜爽 | 国产精品单位女同事在线 | 午夜激情一区 | 手机毛片免费看 | 怡春院日本一区二区久久 | 六月丁香在线播放 | 日本天天色 | 免费va国产高清不卡大片 | 成人免费看片 | 最近中文字幕免费版在线3 最近中文字幕免费版在线 最近中文字幕免费mv在线视频 | 视频在线观看h | 免费国产成人高清视频网站 | 我要色综合网 | 免费三级大片 | 亚洲视频在线网站 | 国产在线精彩视频 | 99精品免费视品 | 亚洲欧美日韩成人网 | 国产www在线观看 |