【設計模式】Java設計模式 -工廠模式
【設計模式】Java設計模式 -工廠模式
😄 不斷學習才是王道
🔥 繼續踏上學習之路,學之分享筆記
👊 總有一天我也能像各位大佬一樣
🏆 一個有夢有戲的人 @怒放吧德德
🌝分享學習心得,歡迎指正,大家一起學習成長!
簡介
在大多情況下,我們都是用new去實例化對象。但是,有時候有的對象的類別有很多種,又存在著共性,就好比如汽車,有Benz,紅旗,寶馬等品牌,如果是一個一個去創建類,那就需要創建很多,因此就需要用到工廠模式。
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);
}
}
定義Benz汽車類和紅旗汽車類。並且繼承基類
Benz:
package com.lyd.demo.entity;
/**
* @Author: lyd
* @Description: Benz汽車類
* @Date: 2022-08-21
*/
public class BenzCar extends ICar {
public BenzCar(String name) {
super(name);
}
public void contract() {
System.out.println("Benz旗艦店和客戶簽訂合約");
}
}
紅旗類與Benz類似,這裡就不貼冗餘程式碼了
②、定義簡單的工廠類
工廠類:
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("BenzGLA");
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)模式
抽象工廠模式提供一個介面,不必去指定具體的產品,創建多個產品族的產品對象。對於普通的工廠來說,可以解決一類對象的創建,但是對象有時候很複雜,在有幾十種對象中又分了好幾種類型,只有一個工廠的話,實現起來就十分複雜,因此需要吧工廠分為很多種,就比如汽車中有Benz、紅旗等,在Benz中又分為了A級C級等,這就可以吧Benz,紅旗創建各自的工廠,由工廠來劃分是具體哪個對象。
UML如圖:

①、定義類
採用以上的Icar抽象類,本次定義了四個類:BenzGLA、BenzGLB、HongQiH5、HongQiH7
package com.lyd.demo.car.entity.benz;
import com.lyd.demo.car.entity.ICar;
/**
* @Author: lyd
* @Description: BenzGLA
* @Date: 2022-08-21
*/
public class BenzGLA extends ICar {
public BenzGLA(String name) {
super(name);
}
public void contract() {
System.out.println("Benz旗艦店和客戶簽訂合約-購買->" + 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);
}
定義Benz和紅旗的工廠類
兩個工廠類也都是差不多,需要實現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: Benz汽車的工廠類
* @Date: 2022-08-21
*/
public class BenzFactory implements ICarFactory {
public ICar createProduct(String CarNo) {
System.out.println("Benz工廠");
ICar car = null;
// 根據id創建產品
if (CarNo.equals("GLA")) {
// 生成GLA型號的Benz汽車
car = new BenzGLA(CarNo);
} else if (CarNo.equals("GLB")) {
// 生成GLB型號的Benz汽車
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")) { // 如果是Benz的品牌
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();
}
}
運行結果:


