您的位置:首页 > 编程语言 > Java开发

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

2016-07-02 23:07 411 查看

意图

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

抽象工厂模式的结构



类图与角色



工厂接口(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();
}
}

抽象工厂适用场景

一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节。
这个系统的产品有多个产品族,而系统只消费其中某一族产品。
同属于同一族的产品必须一起适用,并且这一约束需要在系统的设计中体现出来。
系统提供了一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: