设计模式――简单工厂 (一)

2014-11-24 09:53:47 · 作者: · 浏览: 2

第一个小例子:


public class Apple { 
    /*
     * 采集
     */ 
    public void get(){ 
        System.out.println("采集苹果"); 
    } 
} 

public class Apple {
 /*
  * 采集
  */
 public void get(){
  System.out.println("采集苹果");
 }
}
 
public class Banana { 
    /*
     * 采集
     */ 
    public void get(){ 
        System.out.println("采集香蕉"); 
    } 
} 

public class Banana {
 /*
  * 采集
  */
 public void get(){
  System.out.println("采集香蕉");
 }
}

public class MainClass { 
     
    public static void main(String[] args) { 
        /*
         * 实例化一个Apple
         */ 
        Apple apple = new Apple(); 
        /*
         * 实例化一个Banana
         */ 
        Banana banana = new Banana(); 
         
        apple.get(); 
        banana.get(); 
    }    
} 

public class MainClass {
 
 public static void main(String[] args) {
  /*
   * 实例化一个Apple
   */
  Apple apple = new Apple();
  /*
   * 实例化一个Banana
   */
  Banana banana = new Banana();
  
  apple.get();
  banana.get();
 } 
}

运行结果:

采集苹果
采集香蕉


Apple和Banana都是水果,都有”采集“这个方法,所以这个采集方法可以抽象出来。

再写一个Fruit接口


public interface Fruit { 
 
    /* 
     * 采集 
     */ 
    public void get(); 
} 

 

 
现在Apple和Banana实例化Fruit 

public class Apple implements Fruit{ 
    /* 
     * 采集 
     */ 
    public void get(){ 
        System.out.println("采集苹果"); 
    } 
} 

public class Banana implements Fruit{ 
    /* 
     * 采集 
     */ 
    public void get(){ 
        System.out.println("采集香蕉"); 
    } 
} 
现在可以通过多态(面向对象的特征之一)实例化

public class MainClass { 
     
    public static void main(String[] args) { 
        /* 
         * 实例化一个Apple 
         */ 
        Fruit apple = new Apple(); 
        /* 
         * 实例化一个Banana 
         */ 
        Fruit banana = new Banana(); 
         
        apple.get(); 
        banana.get(); 
    }    
} 

现在我们来创建一个工厂,来专门实例化Fruit的实现。

public class FruitFactory { 
 
    /** 
     * 获得Apple实例 
     */ 
    public Fruit getApple(){ 
        return new Apple(); 
    } 
    /** 
     * 获得Banana实例 
     */ 
    public Fruit getBanana(){ 
        return new Banana(); 
    } 
} 

现在我们可以通过FruitFactory工厂实例化

public class MainClass { 
     
    public static void main(String[] args) { 
        //创建工厂 
        FruitFactory factory = new FruitFactory(); 
        //得到Apple实例 
        Fruit apple = factory.getApple(); 
        //得到Banana实例 
        Fruit banana = factory.getBanana(); 
        //采集 
        apple.get(); 
        banana.get(); 
    }    
} 
由于FruitFactory只是一个工具类,并不需要什么属性,所以我们可以将它的方法静态化。

public class FruitFactory { 
 
    /** 
     * 获得Apple实例 
     */ 
    public static Fruit getApple(){ 
        return new Apple(); 
    } 
    /** 
     * 获得Banana实例 
     */ 
    public static Fruit getBanana(){ 
        return new Banana(); 
    } 
} 

所以实例可以这样得到

public class MainClass { 
     
    public static void main(String[] args) { 
        //得到Apple实例 
        Fruit apple = FruitFactory.getApple(); 
        //得到Banana实例 
        Fruit banana = FruitFactory.getBanana(); 
        //采集 
        apple.get(); 
        banana.get(); 
    }    
} 


可以看出简单工厂模式中主要有三个角色:

工厂角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外部直接调用,创建所需的产品对象。

抽象角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

具体产品角色:简单工厂模式所创建的具体实例对象。


下面我们来讲该工厂方法改进一下

public class FruitFactory { 
     
    /** 
     * get方法,获得所有产品对象 
     * @throws IllegalAccessException  
     * @throws Exception  
     */ 
    public static Fruit getFruit(String type) throws Exception{ 
        if(type.equalsIgnoreCase("apple")){ 
            return (Fruit)Apple.class.newInstance(); 
        }else if(type.equalsIgnoreCase("banana")){ 
            return (Fruit)Banana.class.newInstance(); 
        }else{ 
            System.out.println("找不到相应的类"); 
            return null; 
        } 
    } 
} 

public class MainClass { 
     
    public static void main(String[] args) throws Exception { 
        //得到Apple实例 
        Fruit apple = FruitFactory.getFruit("apple"); 
        //得到Bana