您的位置:首页 > 其它

抽象工厂模式

2017-02-26 16:33 204 查看
  工厂方法模式不清楚可以先查看上一篇博文工厂方法模式,这里先看一个工厂方法模式的例子:

抽象产品类( 汽车总称):

public interface Car
{
//获取车的品牌
public void getCarType();
// 对车进行喷漆
public abstract void paint();
}


具体产品类(奥迪):

public class AudiCar implements Car
{

@Override
public void getCarType()
{
System.out.println("车的品牌为奥迪");

}

@Override
public void paint()
{
System.out.println("对车喷奥迪专用漆");

}

}


具体产品类(奔驰):

public class BenzCar implements Car
{

@Override
public void getCarType()
{
System.out.println("车的品牌为奔驰");

}

@Override
public void paint()
{
System.out.println("对车喷奔驰专用漆");

}

}


具体产品类(保时捷):

public class PorscheCar implements Car
{

@Override
public void getCarType()
{
System.out.println("车的品牌为保时捷");

}

@Override
public void paint()
{
System.out.println("对车喷保时捷专用漆");

}

}


抽象工厂类(AbstractCarFatory):

public abstract class AbstractCarFatory
{
public abstract <T extends Car> T createCar(Class<T> cl);
}


具体工厂类(CarFactory ):

public class CarFactory extends AbstractCarFatory
{

@SuppressWarnings("unchecked")
@Override
public <T extends Car> T createCar(Class<T> cl)
{
// TODO Auto-generated method stub
Car  car = null;
try{
car = (T)Class.forName(cl.getName()).newInstance();
}catch(Exception e)
{
e.printStackTrace();
}
return (T)car;
}

}


场景类(Worker):

public class Worker
{
public static void main(String[] args)
{
//汽车加工厂
AbstractCarFatory  carFatory  = new CarFactory();
//开始造奥迪
System.out.println("=============开始造奥迪===============");
AudiCar audiCar  = carFatory.createCar(AudiCar.class);
audiCar.getCarType();
audiCar.paint();
//开始造奔驰
System.out.println("=============开始造奔驰===============");
BenzCar benziCar  = carFatory.createCar(BenzCar.class);
benziCar.getCarType();
benziCar.paint();
//开始造保时捷
System.out.println("=============开始造保时捷===============");
PorscheCar porscheCar  = carFatory.createCar(PorscheCar.class);
porscheCar.getCarType();
porscheCar.paint();
}
}


车的生产流程执行结果:

=============开始造奥迪===============
车的品牌为奥迪
对车喷奥迪专用漆
=============开始造奔驰===============
车的品牌为奔驰
对车喷奔驰专用漆
=============开始造保时捷===============
车的品牌为保时捷
对车喷保时捷专用漆


假设现在业务发生变化,需要生产不同颜色的车,此时我们需要进行改造,代码如下:

汽车总类(Car类):

public interface Car
{
//获取车的品牌
public void getCarType();
// 对车进行喷漆
public void paint();
//喷漆的颜色
public void getColor();
}


抽象汽车类(Audi,Benz,Porsche下面都有白色,黑色,红色之分,所以把Audi,Benz,Porsche抽象出来)

public abstract class AbstractBenzCar implements Car
{
@Override
public void getCarType()
{
System.out.println("车的品牌为奔驰");

}

@Override
public void paint()
{
System.out.println("对车喷奔驰专用漆");

}
}


public abstract class AbstractAudiCar implements Car
{
@Override
public void getCarType()
{
System.out.println("车的品牌为奥迪");

}

@Override
public void paint()
{
System.out.println("对车喷奥迪专用漆");

}
}


抽象汽车工厂(CarFactory)

public interface CarFactory
{
//生产黑色汽车
public Car creatRedCar();
//生产白色汽车
public Car creatWihteCar();
//生产黑色汽车
public Car creaBlackCar();
}


具体汽车工厂类(audi汽车工厂)

public class AudiFactory implements CarFactory
{
//生产红色Audi
@Override
public Car creatRedCar()
{
// TODO Auto-generated method stub
return new RedAudiCar();
}
//生产白色Audi
@Override
public Car creatWihteCar()
{
// TODO Auto-generated method stub
return new WhiteAudiCar();
}
//生产黑色Audi
@Override
public Car creaBlackCar()
{
// TODO Auto-generated method stub
return new BlackAudiCar();
}

}


具体汽车工厂类(Benz汽车工厂)

public class BenzFactory implements CarFactory
{
//生产红色Audi
@Override
public Car creatRedCar()
{
// TODO Auto-generated method stub
return new RedBenzCar();
}
//生产白色Audi
@Override
public Car creatWihteCar()
{
// TODO Auto-generated method stub
return new WhiteBenzCar();
}
//生产黑色Audi
@Override
public Car creaBlackCar()
{
// TODO Auto-generated method stub
return new BlackBenzCar();
}

}


保时捷工厂与上述工厂类似,不在赘述。

具体的产品类(白色奥迪):

public class WhiteAudiCar extends AbstractAudiCar
{

@Override
public void getColor()
{
System.out.println("白色奥迪");
}
}


具体的产品类(黑色奥迪):

public class BlackAudiCar extends AbstractAudiCar
{

@Override
public void getColor()
{
System.out.println("黑色奥迪");

}
}


具体的产品类(红色奥迪):

public class RedAudiCar extends AbstractAudiCar
{

@Override
public void getColor()
{
System.out.println("红色奥迪");

}
}


还有白色、红色、黑色的奔驰,保时捷汽车与奥迪类似这里不在列出代码。

场景类:

public class Worker
{
public static void main(String[] args)
{
//奥迪生产线
AudiFactory audiFactory = new AudiFactory();
//奔驰生产线
BenzFactory benzFactory = new BenzFactory();
//保时捷生产线
PorscheFactory porscheFactory = new PorscheFactory();
//生产黑色audi
System.out.println("===========生产黑色audi===========");
Car blackAudi = audiFactory.creaBlackCar();
blackAudi.getCarType();
blackAudi.paint();
blackAudi.getColor();
System.out.println("===========生产白色audi===========");
Car whiteAudi =audiFactory.creatWihteCar();
whiteAudi.getCarType();
whiteAudi.paint();
whiteAudi.getColor();
System.out.println("===========生产红色audi===========");
Car redAudi =audiFactory.creatRedCar();
redAudi.getCarType();
redAudi.paint();
redAudi.getColor();
System.out.println("===========生产黑色benz===========");
Car blackBenz = benzFactory.creaBlackCar();
blackBenz.getCarType();
blackBenz.paint();
blackBenz.getColor();
System.out.println("===========生产白色benz===========");
Car whiteBenz =benzFactory.creatWihteCar();
whiteBenz.getCarType();
whiteBenz.paint();
whiteBenz.getColor();
System.out.println("===========生产红色benz===========");
Car redBenz =benzFactory.creatRedCar();
redBenz.getCarType();
redBenz.paint();
redBenz.getColor();
}
}


执行结果为:

===========生产黑色audi===========
车的品牌为奥迪
对车喷奥迪专用漆
黑色奥迪
===========生产白色audi===========
车的品牌为奥迪
对车喷奥迪专用漆
白色奥迪
===========生产红色audi===========
车的品牌为奥迪
对车喷奥迪专用漆
红色奥迪
===========生产黑色benz===========
车的品牌为奔驰
对车喷奔驰专用漆
白色奔驰
===========生产白色benz===========
车的品牌为奔驰
对车喷奔驰专用漆
白色奔驰
===========生产红色benz===========
车的品牌为奔驰
对车喷奔驰专用漆
红色奔驰


这样我们就生产出了不同颜色的汽车。

  上面描述的就是抽象工厂模式,抽象工厂模式是一种常用的模式,其定义如下:Provide an interface for creating families of related or dependent objects without specifying their concrete class.(为创建一组相关或相互依赖的对象提供一个接口,而且无须指定他们的具体类)。

  

  抽象工厂模式相对于工厂方法模式来说,每个具体工厂可以生产一族产品(即多种产品,比如白色奥迪,黑色奥迪,红色奥迪);而工厂方法模式是具体工厂生产相应的具体产品,只能生产一种产品。当产品族中只有一种产品时抽象工厂模式退化成工厂方法模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: