随笔-35  评论-97  文章-0  trackbacks-0

Abstract Factory 模式的意图:

需要为特定的客户(或者对某种情况)提供对象组
Abstract Factory 模式将问题(根据职责)分解为:
1.谁在使用我们的特定对象(Client)
2.谁来决定使用哪些对象(AbstractFactory)

类图(非标准类图,为了给结合例子,稍稍修改):

代码如下:

在例子中,线索是这样的。比如你要买一件衬衫(addi的)和一条西库(nike的),牌子有nike的,还有addi的。约定对应关系如下:

AbstractFactory   ---  衣服生产商
AbstractProductB  ---  西裤
AbstractProductA  ---  衬衫
ConcreteFactory1  --    nike生产商
ConcreteFactory2  --    addi生产商
ConcreteProductA1 --    ××的衬衫
ConcreteProductB1 --    ××的裤子
(在这里ConcreteProductA1、ConcreteProductB1为ConcreteFactory1的产品)
ConcreteProductA2 --    ××的衬衫
ConcreteProductB2 --    ××的裤子
(在这里ConcreteProductA2、ConcreteProductB2为ConcreteFactory2的产品)

 

这里没有对类进行具体细化的命名,只作简单的约定,你可以根据需要修改名称。

抽象工厂:

public interface AbstractFactory {
    
/**
     *  Creates abstract product
     
*/

    AbstractProductA createProductA();

    
/**
     *  Creates abstract product
     
*/

    AbstractProductB createProductB();
}

抽象产品A:

public class AbstractProductA
{
}
抽象产品B:
public class AbstractProductB
{
}

生产1产品的工厂:

public class ConcreteFactory1 implements AbstractFactory {

private  String name;

    
public ConcreteProductA1 createProductA() {
        
return new ConcreteProductA1(name);
    }

    
    
public ConcreteProductB1 createProductB() {
        
return new ConcreteProductB1(name);
    }


    
public ConcreteFactory1(String name)
    
{
        
super();
        
this.name = name;
    }

}

生产2产品的工厂:

public class ConcreteFactory2 implements AbstractFactory
{
    
private  String name;

    
public ConcreteProductA2 createProductA()
    
{
        
return new ConcreteProductA2(name);
    }


    
public ConcreteProductB2 createProductB()
    
{
        
return new ConcreteProductB2(name);
    }


    
public ConcreteFactory2(String name)
    
{
        
super();
        
this.name = name;
    }

}

具体产品A1:

public class ConcreteProductA1 extends AbstractProductA {

    
public ConcreteProductA1(String name)
    
{
        System.out.println(name
+ "的衬衫");
    }

}

 

具体产品B1:

public class ConcreteProductB1 extends AbstractProductB
{
    
public ConcreteProductB1(String name)
    
{
        System.out.println(name
+ "的裤子");
    }

}

 

具体产品A2:

public class ConcreteProductA2 extends AbstractProductA
{
    
public ConcreteProductA2(String name)
    
{
        System.out.println(name
+ "的衬衫");
    }

}

 

具体产品B2:

public class ConcreteProductB2 extends AbstractProductB
{
    
public ConcreteProductB2(String name)
    
{
        System.out.println(name
+ "的裤子");
    }

}

 

测试Client:

public class Client
{
    
/**
     * @directed true
     
*/

    
private AbstractFactory abstractFactory;//衣服生产商
    /**
     * 
@link aggregation
     
*/

    
private AbstractProductB abstractProductB;//西裤
    /**
     * 
@link aggregation
     
*/

    
private AbstractProductA abstractProductA;//衬衫
    
    
public static void main(String[] args)
    
{
        Client client 
= new Client();
        client.buySomething();
    }

    
    
public void buySomething(){
        
//找到nike生产商
        abstractFactory  = new ConcreteFactory1("nike生产商");
        
//买一件西裤(nike)
        abstractProductB = abstractFactory.createProductB();//生产西裤
        
        
//找到addi生产商
        abstractFactory  = new ConcreteFactory2("addi生产商");//生产衬衫
        
//买一件衬衫(addi)
        abstractProductA=abstractFactory.createProductA();//生成衬衫
        
        abstractFactory 
= null;
    }

}

 

结果输出:

nike生产商的裤子
addi生产商的衬衫
posted on 2007-06-05 18:45 三告习习 阅读(1708) 评论(3)  编辑  收藏 所属分类: DesignPattern

评论:
# re: [设计模式篇] Abstract Factory 模式读书笔记与举例 2007-06-05 19:20 | 刘甘泉
又是设计模式,其实也就那么一回事,知道大概的模式的概念就好
在编程的时候不要刻意的去迎合模式,要去迎合抽象就可以了  回复  更多评论
  
# re: [设计模式篇] Abstract Factory 模式读书笔记与举例 2007-06-06 16:59 | pass86
/** *//**
* Creates abstract product
*/
AbstractProductA createProductA();

/** *//**
* Creates abstract product
*/
AbstractProductB createProductB();
这两个接口应该保持不变吧,返回值也一样,
ConcreteFactory1
ConcreteFactory2
中返回值是它们的之类,用java-1.4.0-gcj-1.4.2.0编译不成功,必须继承的接口也要写成返回AbstractProductA或者AbstractProductB。  回复  更多评论
  
# re: [设计模式篇] Abstract Factory 模式读书笔记与举例 2008-02-03 18:02 |
抽象工厂好象还是偶合了一些东西吧?
我觉得不太灵活  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: