代码改变世界

Android Ap 开发 设计模式第四篇:工厂方法模式

2011-07-12 21:07  Terry_龙  阅读(3465)  评论(1编辑  收藏  举报

  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() + "\n" + card2.create() +","+ card2.use() + "\n"
                
+ card3.create() +","+ card3.use());
    }
}

 

最终实现效果:

 

  代码下载:

工厂方法模式

 

  发个求职信息:

  本人因个人原因,会在短期间内离职,想找一份android (java、SecureCRT 、Ubuntu、烧录系统。 一年半经验,可做Framework或者Framework 以上工作,一年半经验都是车载工作,现项目己完成。目前公司行业内前三。但因个人原因可能会离职)或Windows phone 7 (C# 经验一年,Windows Phone 7 完全属于自学状态,但可以在短期内胜任岗位工作),倾向于深圳地区,但不排除外地,希望能找到好公司。邮箱:terryyhl@gmail.com 手机:15012644751