更新時間:2023-01-29 17:06:38 來源:動力節(jié)點 瀏覽1324次
一.簡單(靜態(tài))工廠模式
1,首先建立一個產(chǎn)品的抽象類
需要生產(chǎn)什么產(chǎn)品(實例對象)就需要首先建立一個相應(yīng)產(chǎn)品的抽象類
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)品類如:
這里建立了三個產(chǎn)品類:蘭州拉面,泡面,干扣面(沒吃過)
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.開始根據(jù)客人的要求生產(chǎn)產(chǎn)品
如下代碼是生產(chǎn)干扣面(真心不知道這名字是怎么來的)的過程。
INoodles noodles = SimpleNoodlesFactory.createNoodles(SimpleNoodlesFactory.TYPE_GK);
noodles.desc();
該設(shè)計模式只可以生產(chǎn)工廠能生產(chǎn)的產(chǎn)品,如需要增加產(chǎn)品,需要在工廠類中增加相應(yīng)的靜態(tài)變量。
特點
1 它是一個具體的類,非接口 抽象類。有一個重要的create()方法,利用if或者 switch創(chuàng)建產(chǎn)品并返回。
2 create()方法通常是靜態(tài)的,所以也稱之為靜態(tài)工廠。
缺點
1 擴(kuò)展性差(我想增加一種面條,除了新增一個面條產(chǎn)品類,還需要修改工廠類方法)
2 不同的產(chǎn)品需要不同額外參數(shù)的時候 不支持。
二、另一種簡單工廠(反射):
利用反射Class.forName(clz.getName()).newInstance()實現(xià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實例化面條產(chǎn)品類
*
*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()方法,是利用反射機制生成對象返回,好處是增加一種產(chǎn)品時,不需要修改create()的代碼。
缺點
這種寫法粗看牛逼,細(xì)想之下,不談reflection的效率還有以下問題:
1.個人覺得不好,因為Class.forName(clz.getName()).newInstance()調(diào)用的是無參構(gòu)造函數(shù)生成對象,它和new Object()是一樣的性質(zhì),而工廠方法應(yīng)該用于復(fù)雜對象的初始化 ,當(dāng)需要調(diào)用有參的構(gòu)造函數(shù)時便無能為力了,這樣像為了工廠而工廠。
2.不同的產(chǎn)品需要不同額外參數(shù)的時候 不支持
以上就是“大家一直都在找的Java工廠模式面試題”,你能回答上來嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動力節(jié)點Java官網(wǎng)。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743