java抽象工厂模式(Abstract Factory)-创建型

意图

在客户端不必指定产品的具体类型的情况下,创建多个产品族中的一族产品。
产品族即一系列相关或相互依赖的产品组成的家族。

抽象工厂模式的结构


类图与角色


工厂接口(Factory):所有具体工厂必须实现的接口。为每种类型的产品至少定义一个工厂方法。
具体工厂(Concrete Factory):对Factory接口的实现。
产品接口(Product):所有具体产品必须实现的接口。每一种产品都定义一个产品接口。
具体产品(Concrete Product):对产品接口的实现。

示例

//产品接口 
interface Engine{}//引擎
interface Wheel{}//轮子
//具体产品
class ChinaEngine implements Engine{}
class GermanyEngine implements Engine{}

class ChinaWheel implements Wheel{}
class AmericaWheel implements Wheel{}

//工厂接口 
interface Manufacturer{//制造商
    public Engine getEngine();
    public Wheel getWheel();
}
//具体工厂 
class DZManufacturer implements Manufacturer{//大众汽车制造商
    @Override
    public Engine getEngine(){
        return new ChinaEngine();
    }
     @Override
    public Wheel getWheel(){
        return new ChinaWheel();
    }
}
//具体工厂 
class BMManufacturer implements Manufacturer{//宝马汽车制造商
    @Override
    public Engine getEngine(){
        return new GermanyEngine();
    }
     @Override
    public Wheel getWheel(){
        return new AmericaWheel();
    }
}
//客户端代码
class test  {
	public static void main (String[] args) throws java.lang.Exception	{
	    Manufacturer manu=new DZManufacturer();
	    Car dz=new Car();
	    dz.setEngine(manu.getEngine());
	    dz.setWheel(manu.getWheel());
	    manu=new BMManufacturer();
	    System.out.println("大众汽车制造商生产的汽车:"+dz);
	    Car bm=new Car();
	    bm.setEngine(manu.getEngine());
	    bm.setWheel(manu.getWheel());
	    System.out.println("宝马汽车制造商生产的汽车:"+bm);
	}
}
class Car {
    private Engine engine;
    private Wheel wheel;
    public Engine getEngine(){
        return this.engine;
    }
    public void setEngine(Engine engine){
        this.engine=engine;
    }
    public Wheel getWheel(){
        return this.wheel;
    }
    public void setWheel(Wheel wheel){
        this.wheel=wheel;
    }
    @Override 
    public String toString(){
        return "引擎:"+engine.getClass().getName()+"。轮胎:"+wheel.getClass().getName();
    }
}

抽象工厂适用场景

1、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节。

2、这个系统的产品有多个产品族,而系统只消费其中某一族产品。
3、同属于同一族的产品必须一起适用,并且这一约束需要在系统的设计中体现出来。

4、系统提供了一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值