假如让你设计带有打印功能的电脑,最快的办法就是在电脑类里实例化一个打印机类对象(将某品牌打印集成到电脑内部)。但是这样做有个问题,假如过一段时间打印机坏了或者要更换成更好的打印机,就需要修改电脑类里实例化打印机对象代码(拆开电脑重新集成),这是很不合理的。所以现实世界中打印机和电脑之间都是通过接口连接的,制造打印机的工厂只要按照打印机接口生产就行。如果用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设计模式》——简单工厂模式