linkin大话设计模式--抽象工厂
在前面讲到的简单工厂里面虽然实现了我们那个类和其中的依赖的解耦,但是在产生我们需要的依赖的那个工厂里面还是和具体的产品类耦合了 现在要是还想彻底解耦的话怎么办呢? 就是在我们调用依赖的时候,传入一个参数,然后加入自己的判断这样子的话也就解耦了。在高一个层次就是把工厂也设计成接口和实现类,这样子的话调用一个工厂的工厂先产生一个工厂,然后再调用不同的工厂产生一个产品。貌似有点绕,忽忽,至少我现在不是很懂这样子设计的最大的益处。
代码如下:
<strong><span style="font-size:14px;">public class Computer { //将其中的依赖设置成属性 注意其中的类型是接口 private Output out; //默认的构造器 最好不要省略 不管用到不用到 public Computer(){ } //属性注入的构造器 一般在使用简单工厂的时候 都是将其中的依赖作为输入注入 在spring中也可以使用set方法来注入 public Computer(Output out) { super(); this.out = out; } public void out(){ out.outPrint(); } public static void main(String[] args) { OutputFactory out = OutputFactoryFactory.getOutputFactory("2"); Computer computer = new Computer(out.getOutput()); computer.out(); } } //这里将工厂也变成了接口 现在的设计就是编译时候类型全部都是接口 interface OutputFactory{ public Output getOutput(); } class OutputFactory1 implements OutputFactory{ @Override public Output getOutput() { //实现了接口里面方法 产生对应的工厂的产品 return new Output1(); } } class OutputFactory2 implements OutputFactory{ @Override public Output getOutput() { //不同的工厂生产不同的实体产品 return new Output2(); } } //接口 在上面的Computer类中调用了一个依赖的方法 其中这个类型就是下面的接口的 interface Output{ public void outPrint(); } class Output1 implements Output{ @Override public void outPrint() { System.out.println("output1..."); } } class Output2 implements Output{ @Override public void outPrint() { System.out.println("output2..."); } } class OutputFactoryFactory{ //曾经李刚老师说过说 要是没有太多的代码经验的话 设计模式纯属扯淡 其他的设计模式我可能还有体会 但是这个抽象工厂真心没有感觉 忽忽 反而有点复杂化了。。 //我个人暂时的认为 这里只不过是默认在调用一个依赖的时候不再直接new对象了 以后依赖重构的话这里的代码是不用动的 但是这样子的不停的实现接口 也没见得有多么简单 public static OutputFactory getOutputFactory(String outputFactoryType){ if("1".equalsIgnoreCase(outputFactoryType)){ return new OutputFactory1(); }else{ return new OutputFactory2(); } } }</span></strong>
很多时候,我们不需要纠缠简单工厂模式,抽象工厂模式这些概念,他们统称为工厂模式。
1、如果工厂直接生产被调用对象,那么就是简单工厂模式。
2、如果工厂生产了工厂对象,那么就升级成为了抽象工厂模式。