【設計模式】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();
    }
}

運行結果:
在这里插入图片描述