Factory Method Pattern
模板模式的衍生品?
以Template Method Pattern 架構獲取產生對象實例的工廠就是Factory Method Pattern。
工廠方法模式在父類規定對象的創建方法,但並沒有深入到較具體的類名。所有具體的完整內容 都放在子類。根據這個原則,我們可以大致分成產生對象實例的大綱(框架)和實際生產對象實例的類兩方面。
場景模擬
以一個工廠進廠打工為原型,工人們進廠須先登記信息,由所登記的信息進入創建工卡,工人們每天進廠必須使用工卡打卡,開始一天的勞動。以此為例,進行編程,設計UML圖如下:
程序實現
抽象類Product定義抽象方法create ()表示創建用工card 信息和use () 表示用戶使用card
抽象類Factory實現方法create 的抽象類,這裡就是我們上文所說的為什麼是模板方法模式衍生品。和定義抽象方法createProduct()、抽象方法registerProduct() 交由子類負責完成 。
類IDcard 繼承自Product 實現方法use 和create
類IDCardFactory 繼承 自Factory 實現方法createProduct、registerProduct
Product 抽象類
public abstract class Product {
public abstract String create();
public abstract String use();
}
Factory 抽象類
public abstract class Factory {
public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
}
protected abstract Product createProduct(String owner);
protected abstract void registerProduct(Product product);
}
IDCard 類
public class IDCard extends Product{
private String owner;
public IDCard(String owner) {
// TODO Auto-generated constructor stub
this.owner=owner;
}
@Override
public String use() {
// TODO Auto-generated method stub
return “使用”+owner+”的卡”;
}
public String getOwner(){
return owner;
}
@Override
public String create() {
// TODO Auto-generated method stub
return “建立 “+owner+”的卡”;
}
}
IDCardFactory 類
public class IDCardFactory extends Factory{
private Vector<String> owners=new Vector<String>();
@Override
protected Product createProduct(String owner) {
// TODO Auto-generated method stub
return new IDCard(owner);
}
@Override
protected void registerProduct(Product product) {
// TODO Auto-generated method stub
owners.add(((IDCard)product).getOwner());
}
public Vector<String> getOwners(){
return owners;
}
}
界面代碼實現 FatoryMethodActivity:
public class FatoryMethodActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
((Button) findViewById(R.id.Button01)).setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Factory factory = new IDCardFactory();
Product card1 = factory.create(“terry”);
Product card2 = factory.create(“paul”);
Product card3 = factory.create(“jim”);
((EditText) findViewById(R.id.EditText01)).setText(card1.create()+”,”
+ card1.use() + ”
” + card2.create() +”,”+ card2.use() + ”
“
+ card3.create() +”,”+ card3.use());
}
}
最終實現效果: