1、工廠模式介紹: 2、簡單工廠模式 3、工廠方法模式 4、小結 5、抽象工廠模式 ...
java設計模式2————工廠模式
1、工廠模式介紹:
1.1、實現了創建者與調用者的分離
1.2、詳細分類:
- 簡單工廠模式
- 工廠方法模式
- 抽象工廠模式
1.3、所遵循的OOP原則:
- 開閉原則:對擴展開放,對修改關閉
- 依賴倒轉原則:面向介面編程
- 迪米特法則:只與你直接的朋友進行通信,而避免與陌生人進行通信。
1.4、核心本質
- 實例化對象,不使用new,用工廠方法代替
- 將調用者與我們的實現類解耦
1.5、三種模式
2、簡單工廠模式
2.1、先建立汽車抽象類
package com.xgp.company.第二種_工廠模式.簡單工廠模式;
public interface Car {
void name();
}
2.2、製造車
製造“五凌”車
package com.xgp.company.第二種_工廠模式.簡單工廠模式;
public class WuLing implements Car {
@Override
public void name() {
System.out.println("五凌巨集觀");
}
}
製造“特斯拉”車
package com.xgp.company.第二種_工廠模式.簡單工廠模式;
public class Tesla implements Car {
@Override
public void name() {
System.out.println("特斯拉");
}
}
2.3、創建汽車工廠(兩種方式工廠製造對像)
package com.xgp.company.第二種_工廠模式.簡單工廠模式;
/**
* 簡單工廠模式,又成為靜態工廠模式
* 弊端:增加一個新產品時,如果你不修改代碼,做不到
*/
/**
* 汽車工廠
*/
public class CarFactory {
public static Car getCar(String car) {
if("五凌".equals(car)) return new WuLing();
if("特斯拉".equals(car)) return new Tesla();
return null;
}
/**
* 第二種方式
* @return
*/
public static Car getWuLing() {
return new WuLing();
}
public static Car getTesla() {
return new Tesla();
}
}
2.4、建立買車類(傳統方法創建對象被註釋了和通過工廠創建對象)
package com.xgp.company.第二種_工廠模式.簡單工廠模式;
/**
* 買車
*/
public class Consumer {
/* *//**
* 傳統的方式
* @param args
*//*
public static void main(String[] args) {
//弊端:需要瞭解介面和所有的實現類
Car car1 = new WuLing();
Car car2 = new Tesla();
car1.name();
car2.name();
}*/
/**
* 簡單工廠模式
* @param args
*/
public static void main(String[] args) {
Car car1 = CarFactory.getCar("五凌");
Car car2 = CarFactory.getCar("特斯拉");
car1.name();
car2.name();
}
}
2.5、缺點:如果要增加一個“大眾”的汽車,還需要修改工廠代碼
package com.xgp.company.第二種_工廠模式.簡單工廠模式;
/**
* 弊端:增加實現類時需要改工廠類的代碼
*/
public class Dazhong implements Car {
@Override
public void name() {
System.out.println("大眾");
}
}
2.6、運行結果
五凌巨集觀
特斯拉
2.7、UML類圖
3、工廠方法模式
3.1、建立汽車抽象類
package com.xgp.company.第二種_工廠模式.工廠方法模式;
public interface Car {
void name();
}
3.2、創建車
創建“五凌”車
package com.xgp.company.第二種_工廠模式.工廠方法模式;
public class WuLing implements Car {
@Override
public void name() {
System.out.println("五凌巨集觀");
}
}
創建“特斯拉”車
package com.xgp.company.第二種_工廠模式.工廠方法模式;
public class Tesla implements Car {
@Override
public void name() {
System.out.println("特斯拉");
}
}
3.3、創建汽車工廠的抽象類
package com.xgp.company.第二種_工廠模式.工廠方法模式;
public interface CarFactory {
Car getCar();
}
3.4、創建汽車工廠
創建製造“五凌”車的汽車工廠
package com.xgp.company.第二種_工廠模式.工廠方法模式;
public class WuLingFactory implements CarFactory {
@Override
public Car getCar() {
return new WuLing();
}
}
創建製造“特斯拉”車的汽車工廠
package com.xgp.company.第二種_工廠模式.工廠方法模式;
public class TeslaFactory implements CarFactory {
@Override
public Car getCar() {
return new Tesla();
}
}
3.5、新增一輛“大眾”車
新增一輛“大眾”車
package com.xgp.company.第二種_工廠模式.工廠方法模式;
/**
* 弊端:增加實現類時需要改工廠類的代碼
*/
public class Dazhong implements Car {
@Override
public void name() {
System.out.println("大眾");
}
}
新增一輛“大眾”車的汽車工廠
package com.xgp.company.第二種_工廠模式.工廠方法模式;
public class DazhongFactory implements CarFactory {
@Override
public Car getCar() {
return new Dazhong();
}
}
3.6、創建消費者類
package com.xgp.company.第二種_工廠模式.工廠方法模式;
/**
* 買車
*/
public class Consumer {
public static void main(String[] args) {
Car car1 = new WuLingFactory().getCar();
Car car2 = new TeslaFactory().getCar();
Car car3 = new DazhongFactory().getCar();
car1.name();
car2.name();
car3.name();
}
//根據設計原則:工廠方法模式
//更據實際業務:簡單工廠模式
}
3.7、弊端:增加實現類時需要改工廠類的代碼
總結:
根據設計原則:工廠方法模式
更據實際業務:簡單工廠模式
3.8、UML類圖
4、小節
5、抽象工廠模式
5.1、該模式介紹
5.2、UML類圖設計
5.3、創建生產產品種類的抽象類
package com.xgp.company.第二種_工廠模式.抽象工廠模式;
/**
* 抽象產品工廠
*/
public interface IProductFactory {
//生產手機
IPhoneProduct iphoneProduct();
//生產路由器
IRouterProduct routerProduct();
}
5.4、創建手機和路由器的抽象介面
手機:
package com.xgp.company.第二種_工廠模式.抽象工廠模式;
/**
* 手機介面
*/
public interface IPhoneProduct {
void start(); //開機
void shutdown(); //關機
void callup(); //打電話
void sendSMS(); //發簡訊
}
路由器:
package com.xgp.company.第二種_工廠模式.抽象工廠模式;
/**
* 路由器產品介面
*/
public interface IRouterProduct {
void start(); //開機
void shutdown(); //關機
void openWifi(); //打開網路
void setting(); //設置參數
}
5.5、創建小米工廠
package com.xgp.company.第二種_工廠模式.抽象工廠模式;
public class XiaomiFactory implements IProductFactory {
@Override
public IPhoneProduct iphoneProduct() {
return new XiaomiPhone();
}
@Override
public IRouterProduct routerProduct() {
return new XiaomiRouter();
}
}
5.6、小米工廠製造小米手機、小米路由器
製造小米手機:
package com.xgp.company.第二種_工廠模式.抽象工廠模式;
/**
* 小米手機
*/
public class XiaomiPhone implements IPhoneProduct {
@Override
public void start() {
System.out.println("開啟小米手機");
}
@Override
public void shutdown() {
System.out.println("關閉小米手機");
}
@Override
public void callup() {
System.out.println("小米打電話");
}
@Override
public void sendSMS() {
System.out.println("小米發簡訊");
}
}
製造小米路由器:
package com.xgp.company.第二種_工廠模式.抽象工廠模式;
/**
* 小米路由器
*/
public class XiaomiRouter implements IRouterProduct {
@Override
public void start() {
System.out.println("開啟小米路由器");
}
@Override
public void shutdown() {
System.out.println("關閉小米路由器");
}
@Override
public void openWifi() {
System.out.println("小米網路");
}
@Override
public void setting() {
System.out.println("小米參數");
}
}
5.7、創建華為工廠
package com.xgp.company.第二種_工廠模式.抽象工廠模式;
public class HuaweiFactory implements IProductFactory {
@Override
public IPhoneProduct iphoneProduct() {
return new HuaweiPhone();
}
@Override
public IRouterProduct routerProduct() {
return new HuaweiRouter();
}
}
5.8、華為工廠製造華為手機、華為路由器
製造華為手機:
package com.xgp.company.第二種_工廠模式.抽象工廠模式;
/**
* 華為手機
*/
public class HuaweiPhone implements IPhoneProduct {
@Override
public void start() {
System.out.println("開啟華為手機");
}
@Override
public void shutdown() {
System.out.println("關閉華為手機");
}
@Override
public void callup() {
System.out.println("華為手機打電話");
}
@Override
public void sendSMS() {
System.out.println("華為手機發簡訊");
}
}
製造華為路由器:
package com.xgp.company.第二種_工廠模式.抽象工廠模式;
public class HuaweiRouter implements IRouterProduct {
@Override
public void start() {
System.out.println("開啟華為路由器");
}
@Override
public void shutdown() {
System.out.println("關閉華為路由器");
}
@Override
public void openWifi() {
System.out.println("華為網路");
}
@Override
public void setting() {
System.out.println("華為參數");
}
}
5.9、根據工廠製造產品
package com.xgp.company.第二種_工廠模式.抽象工廠模式;
public class Client {
public static void main(String[] args) {
System.out.println("================小米系列產品=================");
//小米工廠
XiaomiFactory xiaomiFactory = new XiaomiFactory();
//小米手機
IPhoneProduct iphoneProduct = xiaomiFactory.iphoneProduct();
iphoneProduct.start();
iphoneProduct.callup();
iphoneProduct.sendSMS();
iphoneProduct.shutdown();
//小米路由器
IRouterProduct routerProduct = xiaomiFactory.routerProduct();
routerProduct.start();
routerProduct.openWifi();
routerProduct.setting();
routerProduct.shutdown();
System.out.println("================華為系列產品=================");
//華為工廠
HuaweiFactory huaweiFactory = new HuaweiFactory();
//華為手機
iphoneProduct = huaweiFactory.iphoneProduct();
iphoneProduct.start();
iphoneProduct.callup();
iphoneProduct.sendSMS();
iphoneProduct.shutdown();
//華為路由器
routerProduct = huaweiFactory.routerProduct();
routerProduct.start();
routerProduct.openWifi();
routerProduct.setting();
routerProduct.shutdown();
}
}
5.10、運行結果
================小米系列產品=================
開啟小米手機
小米打電話
小米發簡訊
關閉小米手機
開啟小米路由器
小米網路
小米參數
關閉小米路由器
================華為系列產品=================
開啟華為手機
華為手機打電話
華為手機發簡訊
關閉華為手機
開啟華為路由器
華為網路
華為參數
關閉華為路由器
進程完成,退出碼 0