抽象工厂模式
来源:互联网 发布:梦里花落知多少的含义 编辑:程序博客网 时间:2024/06/06 14:10
工厂方法模式不清楚可以先查看上一篇博文工厂方法模式,这里先看一个工厂方法模式的例子:
抽象产品类( 汽车总称):
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.(为创建一组相关或相互依赖的对象提供一个接口,而且无须指定他们的具体类)。
抽象工厂模式相对于工厂方法模式来说,每个具体工厂可以生产一族产品(即多种产品,比如白色奥迪,黑色奥迪,红色奥迪);而工厂方法模式是具体工厂生产相应的具体产品,只能生产一种产品。当产品族中只有一种产品时抽象工厂模式退化成工厂方法模式。
- 工厂模式 -- 抽象工厂
- 工厂模式-抽象工厂
- 工厂模式-抽象工厂
- 工厂模式/抽象工厂模式
- 工厂模式&&抽象工厂模式
- 工厂模式---抽象工厂模式
- 工厂模式&抽象工厂模式
- 工厂模式,抽象工厂模式
- 【模式】抽象工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂&工厂模式&抽象工厂模式
- 工厂方法,抽象工厂模式
- 2,工厂模式--抽象工厂
- C#工厂模式-抽象工厂
- 工厂模式与抽象工厂
- 抽象工厂设计模式
- 抽象工厂模式
- 非注解的映射器和适配器
- 朋友(并查集)
- oracle 对数据库事务的理解
- JS的二维数组
- g++ thread error:unrecognized command line option '-std=C++11'
- 抽象工厂模式
- 浅谈计算机的组成
- 51nod 1519 拆方块
- java学习日志(一)--String、Integer、int之间的类型转换
- python模块学习---HTMLParser(解析HTML文档元素)
- 笔记四:进程间的通信(信号)
- Android--安卓系统提供了什么
- PAT甲级1003
- IDA Pro——CrackMe.exe调试