【設計模式】Java設計模式 -工廠模式
目錄?? 不斷學習才是王道
?? 繼續踏上學習之路,學之分享筆記
?? 總有一天我也能像各位大佬一樣
?? 一個有夢有戲的人 @怒放吧德德
??分享學習心得,歡迎指正,大家一起學習成長!
- 【設計模式】Java設計模式 -工廠模式
- 簡介
- 1、普通工廠(Simple Factory)模式
- ①、定義類
- ②、定義簡單的工廠類
- ③、實體
- 2、抽象工廠(Abstract Factory)模式
- ①、定義類
- ②、定義工廠介面
- ③、實體
簡介
在大多情況下,我們都是用new去實體化物件,但是,有時候有的物件的類別有很多種,又存在著共性,就好比如汽車,有奔馳,紅旗,寶馬等品牌,如果是一個一個去創建類,那就需要創建很多,因此就需要用到工廠模式,
1、普通工廠(Simple Factory)模式
在簡單工廠模式中,可以根據引數的不同回傳不同類的實體,簡單工廠模式專門定義一個類來負責創建其他類的實體,被創建的實體通常都具有共同的父類,
UML如圖:

①、定義類
首先定義一個汽車抽象類
package com.lyd.demo.entity;
/**
* @Author: lyd
* @Description: 產品物體
* @Date: 2022-08-21
*/
public abstract class ICar {
protected String name;
public ICar(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void contract();
public void pickUp() {
System.out.println("提車->" + name);
}
}
定義奔馳汽車類和紅旗汽車類,并且繼承基類
奔馳:
package com.lyd.demo.entity;
/**
* @Author: lyd
* @Description: 奔馳汽車類
* @Date: 2022-08-21
*/
public class BenzCar extends ICar {
public BenzCar(String name) {
super(name);
}
public void contract() {
System.out.println("奔馳旗艦店和客戶簽訂合同");
}
}
紅旗類與奔馳類似,這里就不貼冗余代碼了
②、定義簡單的工廠類
工廠類:
package com.lyd.demo.simpleFactory;
import com.lyd.demo.entity.BenzCar;
import com.lyd.demo.entity.HongQiCar;
import com.lyd.demo.entity.ICar;
import javax.naming.NotContextException;
/**
* @Author: lyd
* @Description: 普通工廠模式
* @Date: 2022-08-20
*/
public class CarFactory {
public static ICar createCar(String carId) throws NotContextException {
switch (carId) {
case "1": return new BenzCar("奔馳GLA");
case "2": return new HongQiCar("紅旗H7");
default: throw new NotContextException("沒有該編號的汽車");
}
}
}
③、實體
測驗實驗
對呼叫者來說,就只需要知道createCar方法,指定汽車的編號就可以實體化出對應的物件
package com.lyd.demo.test;
import com.lyd.demo.entity.ICar;
import com.lyd.demo.simpleFactory.CarFactory;
import javax.naming.NotContextException;
/**
* @Author: lyd
* @Description: 測驗類
* @Date: 2022-08-21
*/
public class SimpleFactoryTest {
public static void main(String[] args) throws NotContextException {
ICar car = CarFactory.createCar("1");
car.contract();
car.pickUp();
}
}
運行結果:

2、抽象工廠(Abstract Factory)模式
抽象工廠模式提供一個介面,不必去指定具體的產品,創建多個產品族的產品物件,對于普通的工廠來說,可以解決一類物件的創建,但是物件有時候很復雜,在有幾十種物件中又分了好幾種型別,只有一個工廠的話,實作起來就十分復雜,因此需要吧工廠分為很多種,就比如汽車中有奔馳、紅旗等,在奔馳中又分為了A級C級等,這就可以吧奔馳,紅旗創建各自的工廠,由工廠來劃分是具體哪個物件,
UML如圖:

①、定義類
采用以上的Icar抽象類,本次定義了四個類:BenzGLA、BenzGLB、HongQiH5、HongQiH7
package com.lyd.demo.car.entity.benz;
import com.lyd.demo.car.entity.ICar;
/**
* @Author: lyd
* @Description: 奔馳GLA
* @Date: 2022-08-21
*/
public class BenzGLA extends ICar {
public BenzGLA(String name) {
super(name);
}
public void contract() {
System.out.println("奔馳旗艦店和客戶簽訂合同-購買->" + name);
}
}
其他類都一樣,就不一個一個粘貼
②、定義工廠介面
ICarFactory:
只提供一個創建產品的介面
package com.lyd.demo.car.factory;
import com.lyd.demo.car.entity.ICar;
/**
* @Author: lyd
* @Description: 汽車工廠
* @Date: 2022-08-21
*/
public interface ICarFactory {
public ICar createProduct(String CarNo);
}
定義奔馳和紅旗的工廠類
兩個工廠類也都是差不多,需要實作ICarFactory,并且實作具體方法,在此方法來根據需要生成對應的物件,
package com.lyd.demo.car.factory.impl;
import com.lyd.demo.car.entity.ICar;
import com.lyd.demo.car.entity.benz.BenzGLA;
import com.lyd.demo.car.entity.benz.BenzGLB;
import com.lyd.demo.car.factory.ICarFactory;
/**
* @Author: lyd
* @Description: 奔馳汽車的工廠類
* @Date: 2022-08-21
*/
public class BenzFactory implements ICarFactory {
public ICar createProduct(String CarNo) {
System.out.println("奔馳工廠");
ICar car = null;
// 根據id創建產品
if (CarNo.equals("GLA")) {
// 生成GLA型號的奔馳汽車
car = new BenzGLA(CarNo);
} else if (CarNo.equals("GLB")) {
// 生成GLB型號的奔馳汽車
car = new BenzGLB(CarNo);
}
if (car != null) return car;
return null;
}
}
紅旗的工廠類同
汽車工廠類:
根據一定的邏輯(本次實驗根據編號)來生成對應的工廠,在由工廠去判斷實體化哪個物件,
package com.lyd.demo.car.factory.impl;
import com.lyd.demo.car.entity.ICar;
import com.lyd.demo.car.factory.ICarFactory;
/**
* @Author: lyd
* @Description: 汽車工廠
* @Date: 2022-08-21
*/
public class CarFactory implements ICarFactory {
public ICar createProduct(String CarNo) {
ICarFactory factory = null;
if (CarNo.equals("GLA") || CarNo.equals("GLB")) { // 如果是奔馳的品牌
factory = new BenzFactory();
} else {
factory = new HongQiFactory();
}
if (factory != null) {
return factory.createProduct(CarNo);
}
return null;
}
}
③、實體
測驗抽象工廠模式
package com.lyd.demo.test;
import com.lyd.demo.car.entity.ICar;
import com.lyd.demo.car.factory.impl.CarFactory;
/**
* @Author: lyd
* @Description: 測驗類
* @Date: 2022-08-21
*/
public class ProductTest {
public static void main(String[] args) {
CarFactory factory = new CarFactory();
ICar car = factory.createProduct("GLA");
car.contract();
}
}
運行結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/503541.html
標籤:其他
上一篇:python資料型別
