简单工厂

来源:互联网 发布:sql forceseek 编辑:程序博客网 时间:2024/05/29 07:15

类图


代码

Product

public interface Product {public void doSomething();}

ProductA

public class ProductA implements Product {@Overridepublic void doSomething() {System.out.println("ProductA -> doSomething");}}

ProductB

public class ProductB implements Product {@Overridepublic 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 blocke.printStackTrace();}}}

0 0
原创粉丝点击