简单工厂,工厂方法和抽象工厂

  一直对简单工厂,工厂方法和抽象工厂分得不清不楚,所以在这里理清一下他们之间的联系,其实他们都属于工厂模式。

  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();
    }
}
View Code

 

  IOutput接口

  

package person.ismallboy;

/**
 * 输出设备接口
 * @author regis
 *
 */
public interface IOutput {
    
    /**
     * 输出方法
     */
    void out();
}
View Code

  BetterPrinter类

  

package person.ismallboy;

public class BetterPrinter implements IOutput {

    @Override
    public void out() {
        // TODO Auto-generated method stub
        System.out.println("BetterPrinter");
    }
}
View Code

  Printer类

  

package person.ismallboy;

public class Printer implements IOutput {

    @Override
    public void out() {
        // TODO Auto-generated method stub
        System.out.println("Printter");
    }    
}
View Code

  工厂类: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;
    }
}
View Code

 

  以上就是简单工厂了,自己慢慢领悟。(例子参考自:李刚老师《轻量级 java EE企业应用实战》一书)

 

2.工厂方法

  工厂方法就是对简单工厂的细分,根据以上的例子,就是简单工厂的对象全部是通过一个工厂来生产产品,而工厂方法是根据分类建立几个工厂,不同的工厂生产不同的对象,就是Printer对象由PrinterFactory工厂生产,BetterPrinter由BetterPrinterFactory工厂生产,这样就可以在工厂里面避免判断的逻辑了,代码如下:

 

……

 

3.抽象工厂

  工厂方法虽然可以避免在工厂里面做逻辑判断,但是这样的话,就导致客户端跟具体的工厂耦合了,这时候,就可以再抽象一层出来,就是抽象一个工厂的工厂出来,就是用一个工厂来生产工厂方法中的具体工厂,这样客户端就可以不用跟具体的工厂耦合了,只要跟工厂的工厂耦合就可以了,这就叫做抽象工厂,即是把工厂也抽象出来,代码如下:

  ……

  

posted @ 2016-08-07 16:28  ismallboy  阅读(260)  评论(0编辑  收藏  举报