java设计模式—工厂模式
何为工厂模式
顾名思义,工厂是生产产品的地方,我们需要什么产品就去什么工厂中拿就行了,而不需要关心它是如何制作的。对于我们面向对象的编程来说,当需要某一个对象的时候,运用工厂设计模式,我们可以不去关心该对象的复杂创建过程,创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
应用实例
比如说:我们需要组装一台电脑,我们只需要将自己选择的cup型号和主板型号告诉组装电脑的工程师即可,我们不需要关系整个的生产以及组装过程。
框架设计
分析:client客户、ComputerEngineer电脑工程师,主要方法是makeComputer组装电脑,以及prepareHardwares准备硬件、CpuFactory负责生产各种型号的cup、MainboardFactory负责生产各种型号的主板,IntelCpu和AmdCpu都是Cpu的具体实现。IntelMainboard和AmdMainboard都是Mainboard的具体实现。
代码
按照上面的框架设计,从下往上进行代码的编写。
1.首先定义接口
Cpu接口
/**
* @author LiHaiNan
* @version V1.0
* @Description: Cpu接口
* @date 下午 9:25 2017/9/20 0020
*/
public interface Cpu {
/**
* @Title: calculate
* @Description: 计算数据
* @Date:下午 9:26 2017/9/20 0020
* @author LiHaiNan
* @param: void
* @return: void
*/
void calculate();
}
Mainboard接口
/**
* @author LiHaiNan
* @version V1.0
* @Description: Mainboard接口
* @date 下午 9:27 2017/9/20 0020
*/
public interface Mainboard {
/**
* @Title: installCpu
* @Description: 安装cup的板子
* @Date:下午 9:27 2017/9/20 0020
* @author LiHaiNan
* @param: void
* @return: void
*/
void installCpu();
}
2.编写两个接口的具体实现
/**
* @author LiHaiNan
* @version V1.0
* @Description: AmdCpu
* @date 下午 9:31 2017/9/20 0020
*/
public class AmdCpu implements Cpu {
//针脚数
private int pins=500;
@Override
public void calculate() {
System.out.println("AmdCpu-pins{}"+pins);
}
}
/**
* @author LiHaiNan
* @version V1.0
* @Description: IntelCpu
* @date 下午 9:31 2017/9/20 0020
*/
public class IntelCpu implements Cpu {
//针脚数
private int pins=600;
@Override
public void calculate() {
System.out.println("IntelCpu-pins{}"+pins);
}
}
/**
* @author LiHaiNan
* @version V1.0
* @Description: AmdMainboard
* @date 下午 9:31 2017/9/20 0020
*/
public class AmdMainboard implements Mainboard{
//cup插槽孔数
private int cpuHoles=500;
@Override
public void installCpu() {
System.out.println("AmdMainboard-cpuHoles{}"+cpuHoles);
}
/**
* @author LiHaiNan
* @version V1.0
* @Description: IntelMainboard
* @date 下午 9:31 2017/9/20 0020
*/
public class IntelMainboard implements Mainboard{
//cup插槽孔数
private int cpuHoles=600;
@Override
public void installCpu() {
System.out.println("IntelMainboard-cpuHoles{}"+cpuHoles);
}
}
3.生产cpu与mainboard的工厂
/**
* @author LiHaiNan
* @version V1.0
* @Description: CpuFactory
* @date 下午 9:43 2017/9/20 0020
*/
public class CpuFactory {
/**
* @Title: createCpu
* @Description: 创建cpu的工厂
* @Date:下午 9:47 2017/9/20 0020
* @author LiHaiNan
* @param: String type
* @return: Cpu
*/
public Cpu createCpu(String type){
Cpu cpu=null;
if ("Intel".equals(type)){
cpu=new IntelCpu();
}else if ("Amd".equals(type)){
cpu=new AmdCpu();
}
return cpu;
}
}
/**
* @author LiHaiNan
* @version V1.0
* @Description: MainboardFactory
* @date 下午 9:43 2017/9/20 0020
*/
public class MainboardFactory {
/**
* @Title: createCpu
* @Description: 创建主板的工厂
* @Date:下午 9:47 2017/9/20 0020
* @author LiHaiNan
* @param: String type
* @return: Mainboard
*/
public Mainboard createMainboard(String type){
Mainboard mainboard=null;
if ("Intel".equals(type)){
mainboard=new IntelMainboard();
}else if ("Amd".equals(type)){
mainboard=new AmdMainboard();
}
return mainboard;
}
}
4.电脑工程师
/**
* @author LiHaiNan
* @version V1.0
* @Description: ComputerEngineer
* @date 下午 9:52 2017/9/20 0020
*/
public class ComputerEngineer {
//组装机器所用的产品
private Cpu cpu=null;
private Mainboard mainboard=null;
//生产产品所用的工厂
CpuFactory cpuFactory=new CpuFactory();
MainboardFactory mainboardFactory=new MainboardFactory();
public void makeComputer(String cpuType,String mainboardType){
//找到工厂获取
cpu=cpuFactory.createCpu(cpuType);
mainboard=mainboardFactory.createMainboard(mainboardType);
//测试产品是否可用
cpu.calculate();
mainboard.installCpu();
}
}
5.客户调用
/**
* @author LiHaiNan
* @version V1.0
* @Description: 客户调用
* @date 下午 10:01 2017/9/20 0020
*/
public class Main {
public static void main(String[] args){
ComputerEngineer computerEngineer=new ComputerEngineer();
computerEngineer.makeComputer("Intel","Intel");
}
}