Simple Factory模式专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。
Factory Method模式将对象的创建交由父类中定义的一个标准方法来完成,而不是其构造函数究竟应该创建何种对象由具体的子类负责决定。
Abstract Factory模式提供一个共同的接口来创建相互关联的多个对象。
1 - Simple Factory模式:例:某个应用需要创建大量的Fish类,如Crucian等,而不只是Crap。抽象出的接口Fish里有方法swim() 我们要创建实例时,往往用下面的方法:Fish crap = new Crap();Fish crucian = new Crucian();
如果要创建大量的Fish对象,这种方法就显得效率低下。采用简单工厂方法:
interface Fish{ public void swim();}
class Factory{ public static Fish factory(String type){ if (type.equalsIgnoreCase("carp")){ return new Carp(); } else if (type.equalsIgnoreCase("crucian")){ return new Crucian(); } else{ return null; } }}
class Carp implements Fish{ public void swim(){ System.out.println("Carp can swim!"); }}
class Crucian implements Fish{ public void swim(){ System.out.println("Crucian can swim!"); }}
public class Test{ public static void main(String args[]){ Fish carp = Factory.factory("carp"); carp.swim(); }}
2 - Factory Method模式:在工厂方法中,核心工厂不再负责所有商品创建,它把具体的创建工作交给具体的子类去做。 这样,允许在系统不修改具体工厂角色的情况下创建出新的产品。interface Creator{ public Fish factory();}
interface Fish{ public void swim();}
class Carp implements Fish{ public void swim(){ System.out.println("Carp can swim!"); }}
class Crucian implements Fish{ public void swim(){ System.out.println("Crucian can swim!"); }}
class CarpCreator implements Creator{ public Fish factory(){ return new Carp(); }}
class CrucianCreator implements Creator{ public Fish factory(){ return new Crucian(); }}
public class Test{ public static void main(String args[]){ CarpCreator carp = new CarpCreator(); carp.factory().swim(); }}
3 - Abstract Factory模式:抽象工厂又称工具箱(KIT),它提供一个创建相关或相互依赖对象的接口,无需指定具体类。
使用指南:1. 一个系统要独立于它的产品的创建、组合和表示时2. 一个系统要生产多个产品族,而系统只消费其中某一族的产品3. 当设计者要强调一系列相关的产品对象的设计以便进行联合使用时4. 当系统提供一个产品类库时,所有产品以同样的接口出现,从而使客户端不依赖于实现
如商品有鱼类和水果类等,同时鱼类可能有热带、温带之分,水果也如此。
interface Creator{ public Fish createFish(); public Fruit createFruit();}
interface Fish{}interface Fruit{}
class TropicalFish implements Fish{}class TropicalFruit implements Fruit{}class TemperateFish implements Fish{}class TemperateFruit implements Fruit{}
class TropicalFactory implements Creator{ public Fish createFish(){ return new TropicalFish(); } public Fruit createFruit(){ return new TropicalFruit(); }}
class TemperateFactory implements Creator{ public Fish createFish(){ return new TemperateFish(); } public Fruit createFruit(){ return new TemperateFruit(); }}
public class Test{ public static void main(String args[]){ TropicalFactory crap = new TropicalFactory(); crap.createFish(); }}