意圖:
定義一個(gè)創(chuàng)建對(duì)象的接口,讓其子類自己決定實(shí)例化哪一個(gè)工廠類原环,工廠模式使其創(chuàng)建過(guò)程延遲到子類進(jìn)行
主要解決:
主要解決接口選擇的問(wèn)題棒动。
何時(shí)使用:
我們明確地計(jì)劃不同條件下創(chuàng)建不同實(shí)例時(shí)恋博。
如何解決:
讓其子類實(shí)現(xiàn)工廠接口瘫絮,返回的也是一個(gè)抽象的產(chǎn)品涨冀。
關(guān)鍵代碼:
創(chuàng)建過(guò)程在其子類執(zhí)行。
優(yōu)點(diǎn):
- 一個(gè)調(diào)用者想創(chuàng)建一個(gè)對(duì)象麦萤,只要知道其名稱就可以了鹿鳖。
- 擴(kuò)展性高,如果想增加一個(gè)產(chǎn)品壮莹,只要擴(kuò)展一個(gè)工廠類就可以翅帜。
- 屏蔽產(chǎn)品的具體實(shí)現(xiàn),調(diào)用者只關(guān)心產(chǎn)品的接口垛孔。
缺點(diǎn):
每次增加一個(gè)產(chǎn)品時(shí)藕甩,都需要增加一個(gè)具體類和對(duì)象實(shí)現(xiàn)工廠施敢,使得系統(tǒng)中類的個(gè)數(shù)成倍增加周荐,在一定程度上增加了系統(tǒng)的復(fù)雜度,同時(shí)也增加了系統(tǒng)具體類的依賴僵娃。這并不是什么好事
實(shí)現(xiàn):
Design:
我們將創(chuàng)建一個(gè) Shape 接口和實(shí)現(xiàn) Shape 接口的實(shí)體類概作。下一步是定義工廠類 ShapeFactory。
FactoryPatternDemo默怨,我們的演示類使用 ShapeFactory 來(lái)獲取 Shape 對(duì)象讯榕。它將向 ShapeFactory 傳遞信息(CIRCLE / RECTANGLE / SQUARE),以便獲取它所需對(duì)象的類型。
步驟:
創(chuàng)建一個(gè)接口:
public interface Shape {
void draw();
}-
創(chuàng)建實(shí)現(xiàn)接口的類:
public class Circle implement Shape{
@overide
public void draw(){
System.out.println("this is a Circle");
}
}public class Rectangle implement Shape{ @overide public void draw(){ System.out.println("this is a Rectangle"); } } public class Square implement Shape{ @overide public void draw(){ System.out.println("this is a Square"); } }
創(chuàng)建工廠類:
public class ShapFactory{
//使用 getShape 方法獲取形狀類型的對(duì)象
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
}
else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
}
else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}-
調(diào)用工廠類創(chuàng)建實(shí)體的對(duì)象:
public class FactoryPatternDemo { public static void main(String[] args) { ShapeFactory shapeFactory = new ShapeFactory(); //獲取 Circle 的對(duì)象愚屁,并調(diào)用它的 draw 方法 Shape shape1 = shapeFactory.getShape("CIRCLE"); //調(diào)用 Circle 的 draw 方法 shape1.draw(); //獲取 Rectangle 的對(duì)象济竹,并調(diào)用它的 draw 方法 Shape shape2 = shapeFactory.getShape("RECTANGLE"); //調(diào)用 Rectangle 的 draw 方法 shape2.draw(); //獲取 Square 的對(duì)象,并調(diào)用它的 draw 方法 Shape shape3 = shapeFactory.getShape("SQUARE"); //調(diào)用 Square 的 draw 方法 shape3.draw(); } }