Abstract Factory 模式的意图:
None.gif 需要为特定的客户(或者对某种情况)提供对象组
Abstract Factory 模式将问题(根据职责)分解为:
None.gif 1 .谁在使用我们的特定对象(Client)
None.gif
2 .谁来决定使用哪些对象(AbstractFactory)
类图(非标准类图,为了给结合例子,稍稍修改): 07-06-05-abstractFactory.jpg
代码如下:
在例子中,线索是这样的。比如你要买一件衬衫(addi的)和一条西库(nike的),牌子有nike的,还有addi的。约定对应关系如下:
None.gif AbstractFactory   ---  衣服生产商
None.gifAbstractProductB  ---  西裤
None.gifAbstractProductA  ---  衬衫
None.gifConcreteFactory1  --    nike生产商
None.gifConcreteFactory2  --    addi生产商
None.gifConcreteProductA1 --    ××的衬衫
None.gifConcreteProductB1 --    ××的裤子
None.gif(在这里ConcreteProductA1、ConcreteProductB1为ConcreteFactory1的产品)
None.gifConcreteProductA2 --    ××的衬衫
None.gifConcreteProductB2 --    ××的裤子
None.gif(在这里ConcreteProductA2、ConcreteProductB2为ConcreteFactory2的产品)
 
这里没有对类进行具体细化的命名,只作简单的约定,你可以根据需要修改名称。
抽象工厂:
ExpandedBlockStart.gif ContractedBlock.gif public   interface  AbstractFactory  dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//**
InBlock.gif     *  Creates abstract product
ExpandedSubBlockEnd.gif     
*/

InBlock.gif    AbstractProductA createProductA();
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//**
InBlock.gif     *  Creates abstract product
ExpandedSubBlockEnd.gif     
*/

InBlock.gif    AbstractProductB createProductB();
ExpandedBlockEnd.gif}
抽象产品A:
None.gif public   class  AbstractProductA
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedBlockEnd.gif}
抽象产品B:
None.gif public   class  AbstractProductB
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedBlockEnd.gif}
生产1产品的工厂:
ExpandedBlockStart.gif ContractedBlock.gif public   class  ConcreteFactory1  implements  AbstractFactory  dot.gif {
InBlock.gif
InBlock.gif
private  String name;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public ConcreteProductA1 createProductA() dot.gif{
InBlock.gif        
return new ConcreteProductA1(name);
ExpandedSubBlockEnd.gif    }

InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public ConcreteProductB1 createProductB() dot.gif{
InBlock.gif        
return new ConcreteProductB1(name);
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public ConcreteFactory1(String name)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
super();
InBlock.gif        
this.name = name;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
生产2产品的工厂:
None.gif public   class  ConcreteFactory2  implements  AbstractFactory
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
private  String name;
InBlock.gif
InBlock.gif    
public ConcreteProductA2 createProductA()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return new ConcreteProductA2(name);
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public ConcreteProductB2 createProductB()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return new ConcreteProductB2(name);
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public ConcreteFactory2(String name)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
super();
InBlock.gif        
this.name = name;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
具体产品A1:
ExpandedBlockStart.gif ContractedBlock.gif public   class  ConcreteProductA1  extends  AbstractProductA  dot.gif {
InBlock.gif
InBlock.gif    
public ConcreteProductA1(String name)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        System.out.println(name
+ "的衬衫");
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
 
具体产品B1:
None.gif public   class  ConcreteProductB1  extends  AbstractProductB
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public ConcreteProductB1(String name)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        System.out.println(name
+ "的裤子");
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
 
具体产品A2:
None.gif public   class  ConcreteProductA2  extends  AbstractProductA
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public ConcreteProductA2(String name)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        System.out.println(name
+ "的衬衫");
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
 
具体产品B2:
None.gif public   class  ConcreteProductB2  extends  AbstractProductB
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public ConcreteProductB2(String name)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        System.out.println(name
+ "的裤子");
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
 
测试Client:
None.gif public   class  Client
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//**
InBlock.gif     * @directed true
ExpandedSubBlockEnd.gif     
*/

InBlock.gif    
private AbstractFactory abstractFactory;//衣服生产商
ExpandedSubBlockStart.gifContractedSubBlock.gif
    /** *//**
InBlock.gif     * 
@link aggregation
ExpandedSubBlockEnd.gif     
*/

InBlock.gif    
private AbstractProductB abstractProductB;//西裤
ExpandedSubBlockStart.gifContractedSubBlock.gif
    /** *//**
InBlock.gif     * 
@link aggregation
ExpandedSubBlockEnd.gif     
*/

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

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

ExpandedBlockEnd.gif}
 
结果输出:
None.gif nike生产商的裤子
None.gifaddi生产商的衬衫