1.首先,抽象出來工廠生產(chǎn)出來的產(chǎn)品模板接口:
package com.gupaoedu.vip.factory;
//產(chǎn)品接口
//汽車需要滿足一定的標(biāo)準(zhǔn)
public interface Car {
//規(guī)定汽車的品牌
String getName();
}
2.定義工廠中可以生產(chǎn)的實(shí)體:
package com.gupaoedu.vip.factory;
public class Audi implements Car{
@Override
public String getName() {
return "Audi";
}
}
package com.gupaoedu.vip.factory;
public class Benz implements Car{
@Override
public String getName() {
return "Benz";
}
}
package com.gupaoedu.vip.factory;
public class Bmw implements Car{
@Override
public String getName() {
return "BMW";
}
}
3.定義一個(gè)工廠便脊,該工廠根據(jù)你想要的實(shí)體名稱子房,生產(chǎn)出不同的實(shí)體:
package com.gupaoedu.vip.factory.simple;
import com.gupaoedu.vip.factory.Audi;
import com.gupaoedu.vip.factory.Benz;
import com.gupaoedu.vip.factory.Bmw;
import com.gupaoedu.vip.factory.Car;
//對于這個(gè)工廠來說(太強(qiáng)大了)
//為什么?
//這個(gè)工廠啥都能干(不符合現(xiàn)實(shí))
//編碼也是一種藝術(shù)(融匯貫通),藝術(shù)來源于生活就轧,回歸到生活的
public class SimpleFactory {
//實(shí)現(xiàn)統(tǒng)一管理、專業(yè)化管理
//如果沒有工廠模式田度,小作坊妒御,沒有執(zhí)行標(biāo)準(zhǔn)的
//如果買到三無產(chǎn)品(沒有標(biāo)準(zhǔn))
//衛(wèi)生監(jiān)督局工作難度會大大減輕
//中國制造(按人家的標(biāo)準(zhǔn)執(zhí)行)
//中國制造向中國創(chuàng)造改變(技術(shù)不是問題了,問題是什么镇饺?思維能力)
//碼農(nóng)就是執(zhí)行標(biāo)準(zhǔn)的人
//系統(tǒng)架構(gòu)師乎莉,就是制定標(biāo)準(zhǔn)的人
//不只做一個(gè)技術(shù)者,更要做一個(gè)思考者
public Car getCar(String name){
if("BMW".equalsIgnoreCase(name)){
//Spring中的工廠模式
//Bean
//BeanFactory(生成Bean)
//單例的Bean
//被代理過的Bean
//最原始的Bean(原型)
//List類型的Bean
//作用域不同的Bean
//getBean
//非常的紊亂奸笤,維護(hù)困難
//解耦(松耦合開發(fā))
return new Bmw();
}else if("Benz".equalsIgnoreCase(name)){
return new Benz();
}else if("Audi".equalsIgnoreCase(name)){
return new Audi();
}else{
System.out.println("這個(gè)產(chǎn)品產(chǎn)不出來");
return null;
}
}
}
4.測試類:
package com.gupaoedu.vip.factory.simple;
import com.gupaoedu.vip.factory.Car;
public class SimpleFactoryTest {
public static void main(String[] args) {
//這邊就是我們的消費(fèi)者
Car car = new SimpleFactory().getCar("Audi");
System.out.println(car.getName());
}
}
缺點(diǎn):當(dāng)生產(chǎn)的實(shí)體很多時(shí)惋啃,需要寫大量的if-else。
改進(jìn):
當(dāng)實(shí)體類過多時(shí)监右,就不能一個(gè)工廠生產(chǎn)全部實(shí)體了边灭,那就多建幾個(gè)工廠,分別生產(chǎn)不同的產(chǎn)品健盒,比如:面粉在面粉廠中生產(chǎn)绒瘦,水杯在水杯廠中生產(chǎn)称簿。
1.定義工廠的接口
package com.gupaoedu.vip.factory.func;
import com.gupaoedu.vip.factory.Car;
//工廠接口,就定義了所有工廠的執(zhí)行標(biāo)準(zhǔn)
public interface Factory {
//符合汽車上路標(biāo)準(zhǔn)
//尾氣排放標(biāo)準(zhǔn)
//電子設(shè)備安全系數(shù)
//必須配備安全帶惰帽、安全氣囊
//輪胎的耐磨程度
Car getCar();
}
2.建立多個(gè)工廠:
package com.gupaoedu.vip.factory.func;
import com.gupaoedu.vip.factory.Audi;
import com.gupaoedu.vip.factory.Car;
public class AudiFactory implements Factory {
@Override
public Car getCar() {
return new Audi();
}
}
package com.gupaoedu.vip.factory.func;
import com.gupaoedu.vip.factory.Benz;
import com.gupaoedu.vip.factory.Car;
public class BenzFactory implements Factory {
@Override
public Car getCar() {
return new Benz();
}
}
package com.gupaoedu.vip.factory.func;
import com.gupaoedu.vip.factory.Bmw;
import com.gupaoedu.vip.factory.Car;
public class BmwFactory implements Factory {
@Override
public Car getCar() {
return new Bmw();
}
}
3.測試類:
package com.gupaoedu.vip.factory.func;
public class FactoryTest {
public static void main(String[] args) {
//工廠方法模式
//各個(gè)產(chǎn)品的生產(chǎn)商憨降,都擁有各自的工廠
//生產(chǎn)工藝,生成的高科技程度都是不一樣的
Factory factory = new AudiFactory();
System.out.println(factory.getCar());
//需要用戶關(guān)心该酗,這個(gè)產(chǎn)品的生產(chǎn)商
factory = new BmwFactory();
System.out.println(factory.getCar());
//增加的代碼的使用復(fù)雜度
//抽象工廠模式
}
}
缺點(diǎn):雖然對工廠進(jìn)行了細(xì)分授药,但是,用戶需要某個(gè)實(shí)體時(shí)呜魄,需要建一個(gè)對應(yīng)的工廠悔叽,比較麻煩,怎么讓用戶接觸不到工廠耕赘,只需要告訴工廠類需要什么骄蝇,工廠類只管生產(chǎn)就行了?
引用抽象工廠:
1)定義一個(gè)抽象工廠操骡,定義一個(gè)默認(rèn)抽象方法protected abstract Car getCar();九火,只要是工廠,就得實(shí)現(xiàn)該方法册招,寶馬工廠岔激,通過重寫該方法,生產(chǎn)寶馬是掰。不同的工廠通過重寫該方法虑鼎,可以生產(chǎn)出不同的實(shí)體,默認(rèn)工廠也是一樣:
package com.gupaoedu.vip.factory.abstr;
import com.gupaoedu.vip.factory.Car;
public abstract class AbstractFactory {
protected abstract Car getCar();
//這段代碼就是動(dòng)態(tài)配置的功能
//固定模式的委派
public Car getCar(String name){
if("BMW".equalsIgnoreCase(name)){
return new BmwFactory().getCar();
}else if("Benz".equalsIgnoreCase(name)){
return new BenzFactory().getCar();
}else if("Audi".equalsIgnoreCase(name)){
return new AudiFactory().getCar();
}else{
System.out.println("這個(gè)產(chǎn)品產(chǎn)不出來");
return null;
}
}
}
2)定義一個(gè)默認(rèn)工廠方法:
package com.gupaoedu.vip.factory.abstr;
import com.gupaoedu.vip.factory.Car;
public class DefaultFactory extends AbstractFactory {
private AudiFactory defaultFactory = new AudiFactory();
public Car getCar() {
return defaultFactory.getCar();
}
}
3)構(gòu)建各種工廠:
package com.gupaoedu.vip.factory.abstr;
import com.gupaoedu.vip.factory.Audi;
import com.gupaoedu.vip.factory.Car;
//具體的業(yè)務(wù)邏輯封裝
public class AudiFactory extends AbstractFactory {
@Override
public Car getCar() {
return new Audi();
}
}
package com.gupaoedu.vip.factory.abstr;
import com.gupaoedu.vip.factory.Benz;
import com.gupaoedu.vip.factory.Car;
public class BenzFactory extends AbstractFactory {
@Override
public Car getCar() {
return new Benz();
}
}
package com.gupaoedu.vip.factory.abstr;
import com.gupaoedu.vip.factory.Bmw;
import com.gupaoedu.vip.factory.Car;
public class BmwFactory extends AbstractFactory {
@Override
public Car getCar() {
return new Bmw();
}
}
4)測試類:
package com.gupaoedu.vip.factory.abstr;
public class AbstractFactoryTest {
public static void main(String[] args) {
DefaultFactory factory = new DefaultFactory();
System.out.println(factory.getCar("Benz"));
//設(shè)計(jì)模式的經(jīng)典之處键痛,就在于炫彩,解決了編寫代碼的人和調(diào)用代碼的人雙方的痛處
//解放我們的雙手
}
}
使用默認(rèn)工廠進(jìn)行生產(chǎn)實(shí)體,如果不傳參數(shù)絮短,使用默認(rèn)工廠生產(chǎn)實(shí)體江兢,如果傳參數(shù),使用父類抽象工廠生產(chǎn)實(shí)體丁频。