GoF 23个经典的设计模式03--创建模式之工厂方法(未完代续)

创建模式的作用是象new 一样创建一个对象。

工厂模式:定义一个创建对象的接口,但是子类决定创建哪个对象。工厂方法让类的创建在子类中进行

Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses. [GoF, p107]
 
首先假设我们可能需要两种产品( Product)对象,但并不要知道他们是怎么创建的,我们只知道有两个工厂会分别生产。
factory_method_dcd_static
两个工厂都继承或实现抽象工厂,都有生产产品的方法。
actory_method_dcd_gof.
用UML图整理手稿
gof3

接下来用JAVA实现:
一般都先创建工厂再调用,而我们真正关心的是怎么调用。所以我们先看Client怎么得到产品对象
package  org.benewu.patterns.factoryMethod;

public   class  Client  {
    
     
public static void main(String[] args) {
        
         Factory factory 
= null;
         
         factory 
= new ConcreteFactoryOne();
         System.out.println(factory.makeProduct().getName());
         
         factory 
= new ConcreteFactoryTwo();
         System.out.println(factory.makeProduct().getName());
    }

}


定义抽象工厂
package  org.benewu.patterns.factoryMethod;

public   abstract   class  Factory  {

    
public abstract Product makeProduct();
}


两个具体工厂继承抽象工厂,提供具体产品
package  org.benewu.patterns.factoryMethod;

public   class  ConcreteFactoryOne  extends  Factory  {

    @Override
    
public Product makeProduct() {
        
        
return new ProductOne();
    }


}



package  org.benewu.patterns.factoryMethod;

public   class  ConcreteFactoryTwo  extends  Factory  {

    @Override
    
public Product makeProduct() {

        
return new ProductTwo();
    }


}



最后也就是我们想要的产品,
首先定义抽象产品
package  org.benewu.patterns.factoryMethod;

public abstract class  Product  {
    
private String name;

    
public String getName() {
        
return name;
    }


    
public void setName(String name) {
        
this.name = name;
    }

}


接下来实现产品
package  org.benewu.patterns.factoryMethod;

public   class  ProductOne  extends  Product  {

    
public ProductOne(){
        setName(
"org.patterns.factoryMethod.ProductOne");
    }

}

package  org.benewu.patterns.factoryMethod;

public   class  ProductTwo  extends  Product  {

    
public ProductTwo(){
        setName(
"org.patterns.factoryMethod.ProductTwo");
    }

}



你觉得工厂方法怎么样?有什么应用吗?


-----------
参考资料:
http://home.earthlink.net/~huston2/dp/patterns.html
http://www.jdon.com/designpatterns/index.htm
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值