假如让你设计带有打印功能的电脑,最快的办法就是在电脑类里实例化一个打印机类对象(将某品牌打印集成到电脑内部)。但是这样做有个问题,假如过一段时间打印机坏了或者要更换成更好的打印机,就需要修改电脑类里实例化打印机对象代码(拆开电脑重新集成),这是很不合理的。所以现实世界中打印机和电脑之间都是通过接口连接的,制造打印机的工厂只要按照打印机接口生产就行。如果用java程序来描述计算机类、打印机类、接口、打印机厂商之间的逻辑关系,就用到了所谓的“简单工厂”设计模式。
1.制定打印机接口标准
public interface Output
{
//打印机应该具有接收数据功能
void getData(String msg);
//打印机应该具有打印输出功能
void out();
}
2.按照接口标准研发打印机
//第一代打印机型号为M10
public class M10 implements Output {
//模拟打印机缓存,用于存放接收到数据
String cache;
//重写接收数据方法
@Override
public void getData(String msg) {
System.out.println("M10打印机接收数据:"+msg);
this.cache = msg;
}
//重写打印方法
@Override
public void out() {
System.out.println("M10打印机正在打印:"+cache);
}
}
3.厂商打印机生产线
public class PrintFactory {
//模拟打印机厂商根据接口标准生产M10型号打印机
public static Output getPrinter() {
return new M10();
}
}
4.设计电脑类
public class Computer {
//模拟电脑上插有一台打印机
private Output printer;
//电脑的构造方法
public Computer(Output printer) {
this.printer = printer;
}
//电脑执行打印命令
public void print(String msg) {
printer.getData(msg);
printer.out();
}
}
5.测试打印
public class Test {
public static void main(String[] args) {
//买一台的打印机
Output printer = PrintFactory.getPrinter();
//买一台dell电脑,并连接上打印机
Computer dell = new Computer(printer);
//电脑执行打印
dell.print("hello world");
}
}
输出:
M10打印机接收数据:hello world
M10打印机正在打印:hello world
假如现在厂商发布了新一代打印机M20,只需要买来新款插上去就可以用了,非常方便,下面用代码模拟。
6.按照接口标准研发新款打印机
//第一代打印机型号为M20
public class M20 implements Output {
//模拟打印机缓存,用于存放接收到数据
String cache;
//重写接收数据方法
@Override
public void getData(String msg) {
System.out.println("M20打印机接收数据:"+msg);
this.cache = msg;
}
//重写打印方法
@Override
public void out() {
System.out.println("M20打印机正在打印:"+cache);
}
}
7.更新厂商打印机生产线
public class PrintFactory {
//模拟打印机厂商根据接口标准生产M20型号打印机
public static Output getPrinter() {
return new M20();
}
}
重新测试打印,输出:
M20打印机接收数据:hello world
M20打印机正在打印:hello world
8.总结
放在实际程序开发中,如果多个Computer类直接组合了M10打印机,后期需要换成M20打印机这是很大的工作量,而且模块之间耦合度较高。如果使用“工厂模式”让Computer类组合一个Output接口的对象,不论打印机换成哪个型号,代码都不用改动,只需修改工厂的一处代码即可完成。
转载请注明:运维博客 » 《JAVA设计模式》——简单工厂模式