我想“一切從實例開始”是我最易接受的方式。網上有太多的理論和經驗總結,于已而言,吸收亦成樂事。
先看實例,很簡單。UML圖也懶得畫了,更喜歡CRC卡片的方式。
一、簡單工廠模式
1. com.cleversoft.designpatterns.simplefactory.Motor.java
package?com.cleversoft.designpatterns.simplefactory;

public?interface?Motor?{
????
public?void?run();
}

2. com.cleversoft.designpatterns.simplefactory.Bus.java
package?com.cleversoft.designpatterns.simplefactory;

public?class?Bus?implements?Motor?{
????
public?Bus()?{

????}


????
public?void?run()?{
????????System.out.println(
"This?is?a?Bus!");
????}

}

3. com.cleversoft.designpatterns.simplefactory.Car.java
package?com.cleversoft.designpatterns.simplefactory;

public?class?Car?implements?Motor{
????
public?Car(){
????????
????}

????
public?void?run(){
????????System.out.println(
"This?is?a?Car!");
????}

}

4. com.cleversoft.designpatterns.simplefactory.MotorFactory.java
package?com.cleversoft.designpatterns.simplefactory;

public?class?MotorFactory?{
????
public?static?Motor?factory(String?which)?{
????????
if?(which.equalsIgnoreCase("bus"))?{
????????????
return?new?Bus();
????????}
?else?if?(which.equalsIgnoreCase("car"))?{
????????????
return?new?Car();
????????}

????????
return?null;
????}

}

5. com.cleversoft.designpatterns.simplefactory.Main.java
package?com.cleversoft.designpatterns.simplefactory;

public?class?Main?{

????
/**
?????*?
@param?args
?????
*/

????
public?static?void?main(String[]?args)?{
????????
//?TODO?Auto-generated?method?stub
????????MotorFactory?mf?=?new?MotorFactory();
????????Motor?m?
=?mf.factory("bus");
????????m.run();
????}


}

二、工廠方法模式
1. com.cleversoft.designpatterns.factorymethod.MotorFactory.java
package?com.cleversoft.designpatterns.factorymethod;

public?interface?MotorFactory?{
????
public?Motor?factory();
}

2. com.cleversoft.designpatterns.factorymethod.Motor.java
package?com.cleversoft.designpatterns.factorymethod;

public?interface?Motor?{
????
public?void?run();
}

3. com.cleversoft.designpatterns.factorymethod.BusFactory.java
package?com.cleversoft.designpatterns.factorymethod;

public?class?BusFactory?implements?MotorFactory{
????
public?Motor?factory(){
????????
return?new?Bus();
????}

}

4. com.cleversoft.designpatterns.factorymethod.CarFactory.java
package?com.cleversoft.designpatterns.factorymethod;

public?class?CarFactory?implements?MotorFactory{
????
public?Motor?factory(){
????????
return?new?Car();
????}

}

5. com.cleversoft.designpatterns.factorymethod.Bus.java
package?com.cleversoft.designpatterns.factorymethod;

public?class?Bus?implements?Motor?{
????
public?Bus()?{

????}


????
public?void?run()?{
????????System.out.println(
"This?is?a?Bus!");
????}

}

6. com.cleversoft.designpatterns.factorymethod.Car.java
package?com.cleversoft.designpatterns.factorymethod;

public?class?Car?implements?Motor?{
????
public?Car()?{

????}


????
public?void?run()?{
????????System.out.println(
"This?is?a?Car!");
????}

}

7. com.cleversoft.designpatterns.factorymethod.Main.java
package?com.cleversoft.designpatterns.factorymethod;

public?class?Main?{

????
/**
?????*?
@param?args
?????
*/

????
public?static?void?main(String[]?args)?{
????????
//?TODO?Auto-generated?method?stub
????????MotorFactory?mf?=?new?BusFactory();
????????Motor?m?
=?mf.factory();
????????m.run();
????}


}

參考資料:
1. http://terrylee.cnblogs.com/archive/2006/01/04/310716.html
2. 《Java與模式》


歡迎大家訪問我的個人網站 萌萌的IT人