简单工厂,工厂方法和抽象工厂
一直对简单工厂,工厂方法和抽象工厂分得不清不楚,所以在这里理清一下他们之间的联系,其实他们都属于工厂模式。
1.首先是简单工厂,就是所有对象,不管分类,都是通过一个工厂生产出来,代码如下:
Computer类
package person.ismallboy; /** * 电脑类 * @author regis * */ public class Computer { private IOutput out; public Computer(IOutput out){ this.out = out; } public void print(){ this.out.out(); } /** * * @param args */ public static void main(String[] args) { OutputFactory of = new OutputFactory(); Computer c = new Computer(of.getOutput("Printer")); c.print(); } }
IOutput接口
package person.ismallboy; /** * 输出设备接口 * @author regis * */ public interface IOutput { /** * 输出方法 */ void out(); }
BetterPrinter类
package person.ismallboy; public class BetterPrinter implements IOutput { @Override public void out() { // TODO Auto-generated method stub System.out.println("BetterPrinter"); } }
Printer类
package person.ismallboy; public class Printer implements IOutput { @Override public void out() { // TODO Auto-generated method stub System.out.println("Printter"); } }
工厂类:OutputFactory
package person.ismallboy; /** * 输出设备生产工厂 * @author regis * */ public class OutputFactory { public IOutput getOutput(String strPrinter){ switch (strPrinter) { case "Printer": return new Printer(); case "BetterPrinter": return new BetterPrinter(); default: break; } return null; } }
以上就是简单工厂了,自己慢慢领悟。(例子参考自:李刚老师《轻量级 java EE企业应用实战》一书)
2.工厂方法
工厂方法就是对简单工厂的细分,根据以上的例子,就是简单工厂的对象全部是通过一个工厂来生产产品,而工厂方法是根据分类建立几个工厂,不同的工厂生产不同的对象,就是Printer对象由PrinterFactory工厂生产,BetterPrinter由BetterPrinterFactory工厂生产,这样就可以在工厂里面避免判断的逻辑了,代码如下:
……
3.抽象工厂
工厂方法虽然可以避免在工厂里面做逻辑判断,但是这样的话,就导致客户端跟具体的工厂耦合了,这时候,就可以再抽象一层出来,就是抽象一个工厂的工厂出来,就是用一个工厂来生产工厂方法中的具体工厂,这样客户端就可以不用跟具体的工厂耦合了,只要跟工厂的工厂耦合就可以了,这就叫做抽象工厂,即是把工厂也抽象出来,代码如下:
……