博客
关于我
《研磨设计模式》chap7 抽象工厂 Abstract Factory
阅读量:62 次
发布时间:2019-02-25

本文共 5424 字,大约阅读时间需要 18 分钟。

场景:配电脑,多种CPU、主板

1. 正常编码

1.1 cpu

//CPU的接口 public interface CPUApi {   	//示意方法,CPU具有运算的功能 	public void calculate();}

IntelCPU:

//Intel的CPU实现 public class IntelCPU implements CPUApi{    	private int pins = 0;//CPU的针脚数目  	//构造方法,传入CPU的针脚数目 	public IntelCPU(int pins){   		this.pins = pins;	} 	public void calculate() {   		System.out.println("now in Intel CPU,pins="+pins);	}}

AMDCPU:

public class AMDCPU implements CPUApi{   	 	private int pins = 0;//CPU的针脚数目	//构造方法,传入CPU的针脚数目 	public AMDCPU(int pins){   		this.pins = pins;	}	public void calculate() {   		System.out.println("now in AMD CPU,pins="+pins);	}}

1.2 主板

//主板的接口 public interface MainboardApi {   	//示意方法,主板都具有安装CPU的功能 	public void installCPU();	}

技嘉主板

public class GAMainboard implements MainboardApi {    	private int cpuHoles = 0;// CPU插槽的孔数  	public GAMainboard(int cpuHoles){   	//构造方法,传入CPU插槽的孔数		this.cpuHoles = cpuHoles;	}	public void installCPU() {   		System.out.println("now in GAMainboard,cpuHoles="+cpuHoles);	}}

微星主板

public class MSIMainboard implements MainboardApi{    	private int cpuHoles = 0;	//CPU插槽的孔数  	//构造方法,传入CPU插槽的孔数 	public MSIMainboard(int cpuHoles){   		this.cpuHoles = cpuHoles;	}	public void installCPU() {   		System.out.println("now in MSIMainboard,cpuHoles="+cpuHoles);	}}

1.3 创建CPU和主板的工厂:

//创建CPU的简单工厂 public class CPUFactory {   	//创建CPU接口对象的方法 	public static CPUApi createCPUApi(int type){   		CPUApi cpu = null;		//根据参数来选择并创建相应的CPU对象		if(type==1){   			cpu = new IntelCPU(1156);		}else if(type==2){   			cpu = new AMDCPU(939);		}		return cpu;	}	} //创建主板的简单工厂 public class MainboardFactory {   	//创建主板接口对象的方法 	public static MainboardApi createMainboardApi(int type){   		MainboardApi mainboard = null;		//根据参数来选择并创建相应的主板对象		if(type==1){   			mainboard = new GAMainboard(1156);		}else if(type==2){   			mainboard = new MSIMainboard(939);		}		return mainboard;	}}

1.4 工程师

public  class ComputerEngineer {    	private CPUApi cpu= null;//定义组装机器需要的CPU 	private MainboardApi mainboard = null;//定义组装机器需要的主板	//装机过程 	public void makeComputer(int cpuType,int mainboardType){   		//1:首先准备好装机所需要的配件		prepareHardwares(cpuType,mainboardType);		//2:组装机器 		//3:测试机器 		//4:交付客户	}	//准备装机所需要的配件 	private void prepareHardwares(int cpuType,int mainboardType){   		//这里要去准备CPU和主板的具体实现,为了示例简单,这里只准备这两个		//可是,装机工程师并不知道如何去创建,怎么办呢?				//直接找相应的工厂获取		this.cpu = CPUFactory.createCPUApi(cpuType);		this.mainboard = MainboardFactory.createMainboardApi(mainboardType);				//测试一下配件是否好用		this.cpu.calculate();		this.mainboard.installCPU();	}}

client:

public static void main(String[] args) {   		//创建装机工程师对象		ComputerEngineer engineer = new ComputerEngineer();		//告诉装机工程师自己选择的配件,让装机工程师组装电脑		engineer.makeComputer(1,2);	}

2. 运用抽象工厂模式

在这里插入图片描述

在这里插入图片描述

  • 定义了一个产品族

比如有2种主板、2种cpu,然后按照工厂模式,可以为create(MainBoardType, CPUType ), 但是现在主板和cpu必须配套。因此有主题。

//抽象工厂的接口,声明创建抽象产品对象的操作 public interface AbstractFactory {   	//示例方法,创建抽象产品A的对象 	public AbstractProductA createProductA();	//示例方法,创建抽象产品B的对象 	public AbstractProductB createProductB();}
public class Schema1 implements AbstractFactory{   	public CPUApi createCPUApi() {   		return new IntelCPU(1156);	}	public MainboardApi createMainboardApi() {   		return new GAMainboard(1156);	}	}
//装机工程师的类 public  class ComputerEngineer {    	private CPUApi cpu= null;//定义组装机器需要的CPU 	private MainboardApi mainboard = null;// 定义组装机器需要的主板 	public void makeComputer(AbstractFactory schema){   //装机过程		//1:首先准备好装机所需要的配件		prepareHardwares(schema);		//2:组装机器				//3:测试机器				//4:交付客户	}		//准备装机所需要的配件 	private void prepareHardwares(AbstractFactory schema){   		//这里要去准备CPU和主板的具体实现,为了示例简单,这里只准备这两个		//可是,装机工程师并不知道如何去创建,怎么办呢?				//使用抽象工厂来获取相应的接口对象		this.cpu = schema.createCPUApi();		this.mainboard = schema.createMainboardApi();				//测试一下配件是否好用		this.cpu.calculate();		this.mainboard.installCPU();	}}

2. 新增加内存的使用

public class Schema1 implements AbstractFactory{   	public Object createProduct(int type) {   		Object retObj = null;		//type为1表示创建CPU,type为2表示创建主板		if(type==1){   			retObj = new IntelCPU(1156);		}else if(type==2){   			retObj = new GAMainboard(1156);		}		return retObj;	}	}public class Schema3 implements AbstractFactory{   	public Object createProduct(int type) {   		Object retObj = null;		//type为1表示创建CPU,type为2表示创建主板,type为3表示创建内存		if(type==1){   			retObj = new IntelCPU(1156);		}else if(type==2){   			retObj = new GAMainboard(1156);		}		//创建新添加的产品		else if(type==3){   			retObj = new HyMemory();		}		return retObj;	}}

调用处:

public class ComputerEngineer {

private CPUApi cpu= null;//定义组装机器需要的CPU
private MainboardApi mainboard = null; //定义组装机器需要的主板
private MemoryApi memory = null; //定义组装机器需要的内存
//装机过程
public void makeComputer(AbstractFactory schema){
//1:首先准备好装机所需要的配件
prepareHardwares(schema);
//2:组装机器

//3:测试机器		//4:交付客户}//准备装机所需要的配件 private void prepareHardwares(AbstractFactory schema){	//这里要去准备CPU和主板的具体实现,为了示例简单,这里只准备这两个	//可是,装机工程师并不知道如何去创建,怎么办呢?		//使用抽象工厂来获取相应的接口对象	this.cpu = (CPUApi)schema.createProduct(1);	this.mainboard = (MainboardApi)schema.createProduct(2);	this.memory = (MemoryApi)schema.createProduct(3);		//测试一下配件是否好用	this.cpu.calculate();	this.mainboard.installCPU();	if(memory!=null){		this.memory.cacheData();	}}

}

public static void main(String[] args) {

//创建装机工程师对象
ComputerEngineer engineer = new ComputerEngineer();
//客户选择并创建需要使用的装机方案对象
AbstractFactory schema = new Schema3();
//告诉装机工程师自己选择的装机方案,让装机工程师组装电脑
engineer.makeComputer(schema);
}

3. 总结

在这里插入图片描述

比较灵活,但是还是不安全。

优缺点:
优点:切换产品族容易。
缺点:容易造成类层次复杂。比如技嘉主板又分好几种,难度又要增加几个类。

转载地址:http://gvq.baihongyu.com/

你可能感兴趣的文章
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
查看>>