类图
代码
Product
public interface Product { public void doSomething(); }
ProductA
public class ProductA implements Product { @Override public void doSomething() { System.out.println("ProductA -> doSomething"); } }
ProductB
public class ProductB implements Product { @Override public void doSomething() { System.out.println("ProductB -> doSomething"); } }
Factory
public class Factory { public static Product create(String type) { if (type.equals("ProductA")) { return new ProductA(); } if (type.equals("ProductB")) { return new ProductB(); } throw new IllegalArgumentException("Not Support type = " + type); } }
Client
public class MainClass { public static void main(String args[]) { Product p = Factory.create("ProductA"); p.doSomething(); } }
优缺点
优点:客户端免去了创建的职责
缺点:
不符合开闭原则
使用字符串的判断形式一定程度上把编译时期的问题推迟到运行时期
改进
对于开闭原则,使用反射的实现
Factory
package com.jue.simplefactory; public class Factory { public static Product create(Class clazzname) throws CreateFaildException { Product product = null; try { product = (Product) clazzname.newInstance(); } catch (Exception e) { e.printStackTrace(); throw new CreateFaildException(); } return product; } public static class CreateFaildException extends Exception { } }
Client
package com.jue.simplefactory; import com.jue.simplefactory.Factory.CreateFaildException; public class MainClass { public static void main(String args[]) { Product p; try { p = Factory.create(ProductA.class); p.doSomething(); } catch (CreateFaildException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }