抽象工厂模式
2017-02-26 16:33
204 查看
工厂方法模式不清楚可以先查看上一篇博文工厂方法模式,这里先看一个工厂方法模式的例子:
抽象产品类( 汽车总称):
具体产品类(奥迪):
具体产品类(奔驰):
具体产品类(保时捷):
抽象工厂类(AbstractCarFatory):
具体工厂类(CarFactory ):
场景类(Worker):
车的生产流程执行结果:
假设现在业务发生变化,需要生产不同颜色的车,此时我们需要进行改造,代码如下:
汽车总类(Car类):
抽象汽车类(Audi,Benz,Porsche下面都有白色,黑色,红色之分,所以把Audi,Benz,Porsche抽象出来)
抽象汽车工厂(CarFactory)
具体汽车工厂类(audi汽车工厂)
具体汽车工厂类(Benz汽车工厂)
保时捷工厂与上述工厂类似,不在赘述。
具体的产品类(白色奥迪):
具体的产品类(黑色奥迪):
具体的产品类(红色奥迪):
还有白色、红色、黑色的奔驰,保时捷汽车与奥迪类似这里不在列出代码。
场景类:
执行结果为:
这样我们就生产出了不同颜色的汽车。
上面描述的就是抽象工厂模式,抽象工厂模式是一种常用的模式,其定义如下:Provide an interface for creating families of related or dependent objects without specifying their concrete class.(为创建一组相关或相互依赖的对象提供一个接口,而且无须指定他们的具体类)。
抽象工厂模式相对于工厂方法模式来说,每个具体工厂可以生产一族产品(即多种产品,比如白色奥迪,黑色奥迪,红色奥迪);而工厂方法模式是具体工厂生产相应的具体产品,只能生产一种产品。当产品族中只有一种产品时抽象工厂模式退化成工厂方法模式。
抽象产品类( 汽车总称):
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.(为创建一组相关或相互依赖的对象提供一个接口,而且无须指定他们的具体类)。
抽象工厂模式相对于工厂方法模式来说,每个具体工厂可以生产一族产品(即多种产品,比如白色奥迪,黑色奥迪,红色奥迪);而工厂方法模式是具体工厂生产相应的具体产品,只能生产一种产品。当产品族中只有一种产品时抽象工厂模式退化成工厂方法模式。
相关文章推荐
- 设计模式--抽象工厂模式
- java设计模式之创建型模式-抽象工厂模式
- JAVA之工厂模式(静态工厂模式(简单工厂模式)、工厂方法模式、抽象工厂模式)
- 设计模式——抽象工厂模式
- 抽象工厂模式- c++实现
- 设计模式之抽象工厂模式
- 抽象工厂模式和php实现
- php简单工厂模式,工厂方法模式和抽象工厂模式比较
- 批注:C++设计模式——抽象工厂模式:横向扩展
- java抽象工厂模式(Abstract Factory)-创建型
- 设计模式(2)-创建型-简单工厂,工厂,抽象工厂模式(Factory)
- 3.抽象工厂模式
- 工厂模式三 抽象工厂模式
- c# 之抽象工厂模式
- 抽象工厂模式
- 设计模式——抽象工厂模式详解
- java设计模式之抽象工厂模式
- 一头扎进设计模式-抽象工厂模式
- 1.抽象工厂模式
- 程序设计模式 —— 抽象工厂模式