設(shè)計(jì)模式學(xué)習(xí)之工廠模式

設(shè)計(jì)模式之工廠模式

1 簡單工廠

簡單工廠嚴(yán)格來說不屬于23種設(shè)計(jì)模式的一種,其只是將創(chuàng)建對象的過程封裝到了方法之中

下面是簡單工廠的具體實(shí)例

創(chuàng)建一個(gè)Animal接口,定義一個(gè)公共方法

public interface IAnimal {
    void eat();
}

創(chuàng)建Animal的實(shí)現(xiàn)類

Bird.class

public class Bird implements IAnimal{
    @Override
    public void eat(){
        System.out.println("bird eating...");
    }
}

Cat.class

public class Cat implements IAnimal{
    @Override
    public void eat(){
        System.out.println("cat eating...");
    }
}

創(chuàng)建工廠類AnimalFactory

public class AnimalFactory {
    public static IAnimal instance(Class<?> clazz){
        if(clazz == null) return null;
        return instance(clazz.getName());
    }
    private static IAnimal instance(String name){
        if(name == null || "".equals(name)) return null;
        try {
            return (IAnimal)Class.forName(name).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

測試案例

public class Main {
    public static void main(String[] args) {
        IAnimal animal = AnimalFactory.instance(Cat.class);
        animal.eat();
    }
}

輸出結(jié)果

cat eating...

2 工廠方法

當(dāng)我們需要在創(chuàng)建對象的前后執(zhí)行一些不同的業(yè)務(wù)邏輯,以上代碼就需要做出很大的變動。

工廠方法模式針對每一個(gè)對象都創(chuàng)建對應(yīng)的工廠,每個(gè)對象的創(chuàng)建工廠是相互獨(dú)立的

創(chuàng)建公共工廠AnimalFactory

public interface IAnimalFactory {
    IAnimal instance();
}

創(chuàng)建對象工廠實(shí)現(xiàn)

BirdFactory.class

public class BirdFactory implements IAnimalFactory{
    @Override
    public IAnimal instance() {
        return new Bird();
    }
}

CatFactory.class

public class CatFactory implements IAnimalFactory{
    @Override
    public IAnimal instance() {
        return new Cat();
    }
}

如上可以在對應(yīng)的instance方法中加入相應(yīng)的處理邏輯

測試案例

public class Main {
    public static void main(String[] args) {
        IAnimalFactory animalFactory = new BirdFactory();
        IAnimal animal = animalFactory.instance();
        animal.eat();
    }
}

輸出結(jié)果

bird eating...

3 抽象工廠

每添加一個(gè)產(chǎn)品,工廠方法模式都要?jiǎng)?chuàng)建一個(gè)工廠,久而久之類會非常之多。

工廠方法模式也不能構(gòu)建有具體行為的產(chǎn)品

抽象工廠的理念是抽象,將工廠進(jìn)行加工,最終生成有具體行為的產(chǎn)品

創(chuàng)建行為

public interface ICreate {}
public interface IDead {}
public interface ILive {}

創(chuàng)建有具體行為的產(chǎn)品

bird

public class BirdCreate implements ICreate{
    public BirdCreate(){
        System.out.println("bird create...");
    }
}

public class BirdDead implements IDead{
    public BirdDead(){
        System.out.println("bird dead...");
    }
}

public class BirdLive implements ILive{
    public BirdLive(){
        System.out.println("bird live...");
    }
}

cat

public class CatCreate implements ICreate{
    public CatCreate(){
        System.out.println("cat create...");
    }
}

public class CatDead implements IDead{
    public CatDead(){
        System.out.println("cat dead...");
    }
}

public class CatLive implements ILive{
    public CatLive(){
        System.out.println("cat live...");
    }
}

創(chuàng)建工廠

public interface IAnimalFactory {
    //創(chuàng)建新生動物
    ICreate create();
    //創(chuàng)建活物
    ILive live();
    //創(chuàng)建死物
    IDead dead();
}

最后實(shí)現(xiàn)具體的產(chǎn)品工廠

BirdFactory

public class BirdFactory implements IAnimalFactory {
    @Override
    public ICreate create() {
        return new BirdCreate();
    }
    @Override
    public ILive live() {
        return new BirdLive();
    }
    @Override
    public IDead dead() {
        return new BirdDead();
    }
}

CatFactory

public class CatFactory implements IAnimalFactory {
    @Override
    public ICreate create() {
        return new CatCreate();
    }
    @Override
    public ILive live() {
        return new CatLive();
    }
    @Override
    public IDead dead() {
        return new CatDead();
    }
}

測試案例

public class Main {
    public static void main(String[] args) {
        IAnimalFactory animalFactory = new CatFactory();
        animalFactory.create();
        animalFactory.live();
        animalFactory.dead();
    }
}

輸出結(jié)果

cat create...
cat live...
cat dead...

抽象工廠模式不符合開閉原則,當(dāng)增加行為時(shí),所有的具體實(shí)現(xiàn)都需要增加相應(yīng)的行為

ps:以上接口可用抽象類代替

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容