工厂模式

本文通过一个具体的例子介绍了抽象工厂模式的实现方式。该模式适用于需要为特定客户提供一组相关或相互依赖对象的情况,避免了直接实例化这些对象。文章详细展示了抽象工厂、具体工厂及产品类的设计,并提供了完整的代码示例。

网上找的例子:

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;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值