Java實現工廠模式

lypzzzz發表於2021-07-01

工廠模式(Factory),當需要根據執行時的一些條件來決定建立具體物件時,就應該考慮使用工廠設計模式,將建立物件的任務交給工廠集中處理。
工廠模式有多種寫法,總體分為簡單工廠模式和抽象工廠模式

工廠模式示例:星工場

加入星工場可以生產各種明星:唱歌的,跳舞的,打籃球的...

明星抽象類

public abstract class Star
{
    public abstract void show();
}

唱歌的

public class SingStar extends Star
{
    @Override
    public void show()
    {
        System.out.println("你看這碗又大又圓 你看這面又長又寬");
    }
}

跳舞的

public class DancingStar extends Star
{
    @Override
    public void show()
    {
        System.out.println("唱 跳 Rap");
    }
}

打籃球的

public class BasketballStar extends Star
{
    @Override
    public void show()
    {
        System.out.println("波蘭第一中鋒");
    }
}

現在要建立一個明星,引數為明星的型別

不使用工廠

如果不使用工廠,就是在需要物件的地方,直接建立物件

public Star newStar(String type)
{
    Star star=null;
    if(type.equals("singer"))
    {
        star=new SingStar();
    }
    else if(type.equals("dancer"))
    {
        star=new DancingStar();
    }
    else if(type.equals("basketball"))
    {
        star=new BasketballStar();
    }
    return star;
}

簡單工廠模式

簡單工廠其實就是把建立物件的程式碼抽取到一個單獨的工廠類中,需要物件的地方,呼叫工廠類中的方法即可

public class SimpleFactory
{
    public Star newStar(String type)
    {
        Star star=null;
        if(type.equals("singer"))
        {
            star=new SingStar();
        }
        else if(type.equals("dancer"))
        {
            star=new DancingStar();
        }
        else if(type.equals("basketball"))
        {
            star=new BasketballStar();
        }
        return star;
    }
}

還可以使用靜態方法,稱為靜態工廠模式

public static Star newStar(String type)
{
    // ...
}

還可以將表示物件型別的引數從字串型別改為使用Class物件,進一步簡化程式碼

public static Star newStar(Class<? extends Star> clz)
{
    try
    {
        return clz.getConstructor().newInstance();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    return null;
}

使用的時候,傳入對應型別的Class物件即可

Star star = SimpleFactory.newStar(SingStar.class);
star.show();

抽象工廠模式

抽象工廠模式,其實就是工廠的工廠。

首先需要定義工廠共同實現的介面,然後每個工廠分別實現它。

抽象工廠介面

public interface Factory
{
    Star newStar(Class<? extends Star> clz);
}

具體工廠類略

相關文章