工厂方法模式(Factory Method):定义一个用于创建对象的接口IProductFactory,在具体的CreateProdcutFactory子类的CreateProduct方法中根据传进的参数即具体产品类的类型决定实例化哪一个IProduct产品,如果有新添加的产品,只要在客户端修改传给CreateProduct方法的参数即可,符合面相对象的“开闭原则”,
适用性:
1.当一个类不知道它所必须创建的对象的类的时候
2.当一个类希望由它的子类来指定它所创建的对象的时候
3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将那一个帮助子类是代理者这一信息局部化的时候
类图如下:
示例工程结构:
示范代码:
IProduct:
package test.edu.product; public interface IProduct { public void getProductName(); public void productBehavior(); public void destoryProduct(); }IProductFactory:
package test.edu.productfactory; public interface IProductFactory { public <T> T createProduct(Class<T> classType); }
自行车:
package test.edu.productIimpl; import test.edu.product.IProduct; public class Bike implements IProduct { @Override public void getProductName() { // TODO Auto-generated method stub System.out.println("这是自行车"); } @Override public void productBehavior() { // TODO Auto-generated method stub System.out.println("自行车是交通工具可以被骑行"); } @Override public void destoryProduct() { // TODO Auto-generated method stub System.out.println("自行车报废,已被回收"); } }
package test.edu.productIimpl; import test.edu.product.IProduct; public class Bread implements IProduct { @Override public void getProductName() { // TODO Auto-generated method stub System.out.println("这是面包"); } @Override public void productBehavior() { // TODO Auto-generated method stub System.out.println("可以用来充饥"); } @Override public void destoryProduct() { // TODO Auto-generated method stub System.out.println("面包过期了,需要当垃圾扔掉"); } }具体的工厂类:
package test.edu.productIimpl; import test.edu.productfactory.IProductFactory; public class CreateProdcutFactory implements IProductFactory { @Override public <T> T createProduct(Class<T> classType) { try { return (T)classType.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return null; } }
package test.edu.client; import test.edu.product.IProduct; import test.edu.productIimpl.Bike; import test.edu.productIimpl.Bread; import test.edu.productIimpl.CreateProdcutFactory; import test.edu.productfactory.IProductFactory; public class Client { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub IProductFactory proFactory = new CreateProdcutFactory(); IProduct pro = proFactory.createProduct(Bread.class); pro.getProductName(); pro.productBehavior(); pro.destoryProduct(); pro = proFactory.createProduct(Bike.class); pro.getProductName(); pro.productBehavior(); pro.destoryProduct(); } }
这是面包 可以用来充饥 面包过期了,需要当垃圾扔掉 这是自行车 自行车是交通工具可以被骑行 自行车报废,已被回收
优点:
1、 在工厂方法中,用户只需要知道所要产品的具体工厂,无须关系具体的创建过程,甚至不需要具体产品类的类名。
2、 在系统增加新的产品时,我们只需要添加一个具体产品类,无需对原工厂进行任何修改,很好地符合了“开闭原则”。
不适合产品族的场景,可和抽象工厂做比较.