http://www.cqvip.com/read/read.aspx?id=47891695#
上面是对简单工厂方法在面向接口编程中应用的详细阐述。下面是我的java实现。
简单工厂:
package simpleFactoryPattern; /** * 简单工厂模式/静态工厂/万能工厂 * 描述:通过专门创建一个类来创建其他类的实例,被创建的实例通过都具有共同的父接口。 * 优点: * 隐藏创建具体类的过程。 * 如果简单的使用面向接口编程,客户端不仅与依赖接口,而且还要知道使用哪个实现类,导致客户端与实现耦合过紧。 * 这样可以通过简单工厂解决,客户仅需要与工厂耦合,由工厂创建实例。 * 缺点: * 1. 在工厂中需要判断逻辑选择具体的实现类,参数可以通过配置文件,也可以通过客户端传递参数的方式传进工厂。 * 如果通过客户端传递参数的方式,客户端必须知道某些参数的含义,导致系统向客户端暴露了系统细节。 * 2. 如果添加一个新的实现类,则需要修改和重新编译工厂类。不对扩展开放。 * 注: 通过在配置文件中指定具体的实现类可以解决简单工厂的确定,例如下面SimpleFactory2的实现。 * * @author hello world * */ class SimpleFactory1 { public static AbstractProduct createProduct(String productCategory) throws Exception { switch (productCategory) { case "1": return ConcreteProduct1.class.newInstance(); case "2": return ConcreteProduct2.class.newInstance(); default: System.out.println("没有合适的商品创建!"); return null; } } } class SimpleFactory2 { public static AbstractProduct createProduct() throws Exception { // 读取config.xml文件中<implement_class>中的类全限定名读出。并创建 String identifiedName = "simpleFactoryPattern.ConcreteProduct1"; // 这个通过读取xml文件获取 return (AbstractProduct) Class.forName(identifiedName).newInstance(); } } public class SimpleFactoryPattern { public static void main(String[] args) throws Exception { // 在客户端无需了解实现类,只需要了解接口。只需要传递进参数,由简单工厂通过一定方式创建实例。 // 这种通过传递参数方式来选择实现类也导致系统向客户暴露了一部分的细节,解决方式是通过配置文件决定具体的实现类。 AbstractProduct product = SimpleFactory1.createProduct("1"); } }
抽象接口:
package simpleFactoryPattern; public interface AbstractProduct { }
具体实现:
package simpleFactoryPattern; public class ConcreteProduct1 implements AbstractProduct{ }
package simpleFactoryPattern; public class ConcreteProduct2 implements AbstractProduct { }