工廠模式(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);
}
具體工廠類略