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

来源:互联网 发布:奥杜尔档案馆数据圆盘 编辑:程序博客网 时间:2024/06/05 12:50

意图

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

抽象工厂模式的结构


类图与角色


工厂接口(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、系统提供了一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

0 0
原创粉丝点击