欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java創(chuàng)建型設(shè)計模式之工廠方法模式深入詳解

 更新時間:2022年09月23日 15:07:45   作者:丨Jack_Chen丨  
工廠方法模式(FACTORY METHOD)是一種常用的類創(chuàng)建型設(shè)計模式,此模式的核心精神是封裝類中變化的部分,提取其中個性化善變的部分為獨(dú)立類,通過依賴注入以達(dá)到解耦、復(fù)用和方便后期維護(hù)拓展的目的。它的核心結(jié)構(gòu)有四個角色,分別是抽象工廠、具體工廠、抽象產(chǎn)品、具體產(chǎn)品

簡單工廠模式

簡單工廠模式(Simple Factory Pattern)是指由一個工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實例,但是它不屬于設(shè)計模式。

簡單工廠適用于工廠類負(fù)責(zé)創(chuàng)建的對象較少的場景,且客戶端只需要傳入工廠類的參數(shù),對于如何創(chuàng)建對象的邏輯不需要關(guān)心。

定義產(chǎn)品對象

public interface ICar {
    void create();
}
public class BMCar implements ICar{
    @Override
    public void create(){
        System.out.println("制造BM車");
    }
}
public class ADCar implements ICar {
    @Override
    public void create() {
        System.out.println("制造AD車");
    }
}

創(chuàng)建工廠類

創(chuàng)建一個實現(xiàn)工廠類,所有的對象交由該工廠類創(chuàng)建

public class CarFactory {
    public ICar create(ICar car) {
        if (car instanceof BMCar) {
            return new BMCar();
        } else if (car instanceof ADCar) {
            return new ADCar();
        } else {
            return null;
        }
    }
}
    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();
        ICar bm = carFactory.create(new BMCar());
        bm.create();
        ICar ad = carFactory.create(new ADCar());
        ad.create();
    }

工廠使用反射

上述方式隨著業(yè)務(wù)擴(kuò)展,就需要修改createAnimal方法中的邏輯代碼,不符合開閉原則。

可使用反射技術(shù),即使業(yè)務(wù)變化擴(kuò)展,也不需要修改AnimalFactory中的邏輯代碼

public class CarFactory {
    public ICar create(String className) {
        try {
            if (!(null == className || "".equals(className))) {
                return (ICar) Class.forName(className).newInstance();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();
        ICar bm = carFactory.create("cn.ybzy.demo.BMCar");
        bm.create();
    }

上述方式的缺點(diǎn)是方法參數(shù)是字符串,有著不可控的風(fēng)險??蛇M(jìn)一步優(yōu)化,使用強(qiáng)制類型限制,控制參數(shù)傳遞

public class CarFactory {
    public ICar create(Class<? extends ICar> clazz) {
        try {
            if (!(null == clazz)) {
                return clazz.newInstance();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();
        ICar bm = carFactory.create(BMCar.class);
        bm.create();
    }

工廠方法模式

概述

工廠方法模式是簡單工廠模式的衍生,解決了許多簡單工廠模式的問題。工廠方法模式屬于創(chuàng)建型模式。

工廠模式(Factory Pattern)是Java中最常用的設(shè)計模式之一。它提供了一種創(chuàng)建對象的最佳方式。

它定義一個創(chuàng)建對象的接口,讓其子類自己決定實例化哪一個工廠類,工廠模式使其創(chuàng)建過程延遲到子類進(jìn)行。

在工廠方法模式中只需要關(guān)心所需產(chǎn)品對應(yīng)的工廠,無須關(guān)心創(chuàng)建細(xì)節(jié),而且加入新的產(chǎn)品符合開閉原則。

應(yīng)用場景

1.創(chuàng)建對象需要大量重復(fù)的代碼。

2.客戶端(應(yīng)用層)不依賴于產(chǎn)品類實例如何被創(chuàng)建、實現(xiàn)等細(xì)節(jié)。

3.一個類通過其子類來指定創(chuàng)建哪個對象。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

1.一個調(diào)用者想創(chuàng)建一個對象,只需要知道其名稱就可以

2.擴(kuò)展性高,如果想增加一個產(chǎn)品,只需要擴(kuò)展一個工廠類

3.屏蔽產(chǎn)品的具體實現(xiàn),調(diào)用者只關(guān)心產(chǎn)品的接口

缺點(diǎn):

1.每增加一個產(chǎn)品時,都需要增加一個具體類和對象實現(xiàn)工廠,使系統(tǒng)中類的個數(shù)成倍增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,同時也增加了系統(tǒng)具體類的依賴。

主要角色

1.抽象產(chǎn)品角色(Product)

工廠方法模式所創(chuàng)建的對象的超類型,也就是產(chǎn)品對象的共同父類或共同擁有的接口。

2.具體產(chǎn)品角色(Concrete Product)

這個角色實現(xiàn)了抽象產(chǎn)品角色所定義的接口。某具體產(chǎn)品有專門的具體工廠創(chuàng)建,它們之間往往一一對應(yīng)。

3.抽象工廠角色(Creator)

是工廠方法模式的核心,與應(yīng)用程序無關(guān)。任何在模式中創(chuàng)建的對象的工廠類必須實現(xiàn)這個接口。

4.具體工廠角色(Concrete Creator)

這是實現(xiàn)抽象工廠接口的具體工廠類,包含與應(yīng)用程序密切相關(guān)的邏輯,并且受到應(yīng)用程序調(diào)用以創(chuàng)建產(chǎn)品對象。

工廠方法模式的基本使用

創(chuàng)建抽象產(chǎn)品

創(chuàng)建抽象產(chǎn)品角色,工廠類所創(chuàng)建的產(chǎn)品的父類,封裝了產(chǎn)品對象的公共方法

public abstract class AbstractCar {
    public abstract void run();
}

創(chuàng)建具體產(chǎn)品

public class Car extends AbstractCar {
    public void run() {
        System.out.println("Car run");
    }
}

創(chuàng)建抽象工廠

public abstract class ICarFactory {
    public abstract <T> T create(Class<T> clazz);
}

創(chuàng)建具體工廠

創(chuàng)建多個實現(xiàn)抽象工廠接口的具體工廠類。負(fù)責(zé)實現(xiàn)創(chuàng)建產(chǎn)品的內(nèi)部邏輯,該工廠類可以被直接調(diào)用,創(chuàng)建所需的具體對象。

public class CarFactory extends ICarFactory {
    @Override
    public <T> T create(Class<T> clazz) {
        Car car;
        try {
            car = (Car) Class.forName(clazz.getName()).getConstructor().newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return (T) car;
    }
}

客戶端執(zhí)行

通過一個工廠類,對實現(xiàn)了同一接口的一些類進(jìn)行實例的創(chuàng)建

    public static void main(String[] args) {
        ICarFactory factory = new CarFactory();
        Car car = factory.create(Car.class);
        car.run();
    }

Car run

到此這篇關(guān)于Java創(chuàng)建型設(shè)計模式之工廠方法模式深入詳解的文章就介紹到這了,更多相關(guān)Java工廠方法模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論