介紹
關(guān)于設(shè)計(jì)模式,大家可能已經(jīng)有很多了解了。因此這里直接開(kāi)始吧回铛。首先來(lái)介紹一下工廠(chǎng)方法模式,它是一種創(chuàng)建型模式克锣。在設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)中對(duì)工廠(chǎng)方法由如下的解釋茵肃。
工廠(chǎng)方法模式的實(shí)質(zhì)是“定義一個(gè)創(chuàng)建對(duì)象的接口,但讓實(shí)現(xiàn)這個(gè)接口的類(lèi)來(lái)決定實(shí)例化哪個(gè)類(lèi)袭祟。工廠(chǎng)方法讓類(lèi)的實(shí)例化推遲到子類(lèi)中進(jìn)行验残。”
當(dāng)然在實(shí)際情況中并不一定非要死板的定義一個(gè)工廠(chǎng)接口和多個(gè)工廠(chǎng)具體類(lèi)巾乳。如果某個(gè)類(lèi)對(duì)象創(chuàng)建復(fù)雜您没,我們也可以直接創(chuàng)建相應(yīng)的工廠(chǎng)類(lèi)鸟召,這時(shí)候這種方式叫做簡(jiǎn)單工廠(chǎng)。
工廠(chǎng)方法模式在很多地方都有應(yīng)用氨鹏,例如Hibernate的SessionFactory欧募、JPA的EntityManagerFactory等等。
適用性
如果對(duì)象創(chuàng)建需要大量重復(fù)代碼仆抵,那么我們就可以考慮使用工廠(chǎng)方法重構(gòu)代碼跟继。當(dāng)然,如果一組對(duì)象需要統(tǒng)一創(chuàng)建和管理镣丑,我們也可以使用工廠(chǎng)方法模式舔糖。總之莺匠,只要確實(shí)有必要你就可以使用該模式金吗。在使用該模式的時(shí)候相關(guān)類(lèi)最好使用Factory來(lái)命名,這樣其他人也能比較輕松的識(shí)別出這是工廠(chǎng)模式慨蛙。
代碼例子
下面用Java代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單工廠(chǎng)的例子辽聊。首先我們來(lái)編寫(xiě)一組相關(guān)類(lèi)。
public interface Shape {
int Square = 1;
int Circle = 2;
int Rectangle = 3;
void print();
}
public class Circle implements Shape {
@Override
public void print() {
System.out.println("圓");
}
}
public class Rectangle implements Shape {
@Override
public void print() {
System.out.println("長(zhǎng)方形");
}
}
public class Square implements Shape {
@Override
public void print() {
System.out.println("正方形");
}
}
然后來(lái)編寫(xiě)工廠(chǎng)方法期贫。在工廠(chǎng)方法模式中跟匆,具體的創(chuàng)建類(lèi)的代碼就在工廠(chǎng)類(lèi)中。我們這里只是一個(gè)簡(jiǎn)單的例子通砍。實(shí)際的代碼要比這復(fù)雜的多玛臂。
public class ShapeFactory {
public Shape getShape(int shapeType) {
Shape shape = null;
switch (shapeType) {
case Shape.Square:
shape = new Square();
break;
case Shape.Circle:
shape = new Circle();
break;
case Shape.Rectangle:
shape = new Rectangle();
break;
}
return shape;
}
}
之后我們就可以通過(guò)工廠(chǎng)來(lái)創(chuàng)建對(duì)象了。
public void run() {
ShapeFactory factory = new ShapeFactory();
Shape square = factory.getShape(Shape.Square);
square.print();
Shape rectangle = factory.getShape(Shape.Rectangle);
rectangle.print();
Shape circle = factory.getShape(Shape.Circle);
circle.print();
}