简介
简单工厂模式属于创建型模式,是工厂模式的一种。简单工厂模式通过定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类,这个父类具有共有的属性和方法。因在简单工厂模式中用于创建实例的方法通常是静态方法,因此也称为静态工厂方法模式
-
Product 表示产品接口,也可用抽象类实现,封装产品间共有的属性
-
ProductA、ProductB 表示具体的实际产品
-
Factory 表示工厂,工厂根据需要来创建相应的产品
实现
- 产品接口
-
public interface Product {void display(); }
-
- 产品接口实现子类
-
产品A类
public class ProductA implements Product {@Overridepublic void display() {System.out.println("This is product A");} }
- 产品B类
public class ProductB implements Product {@Overridepublic void display() {System.out.println("This is product B");} }
-
- 简单工厂类
-
public class Factory {/*** 方式一:根据名称创建具体的日志记录器* @param type* @return*/public static Product createProductByType(String type){Product product = null;if ("ProductA".equals(type)) {product = new ProductA();} else if ("ProductB".equals(type)) {product = new ProductB();}return product;}/*** 通过反射创建日志记录器* @param cls* @return*/public static Product createProductByClass(Class cls){Product product = null;try {product = (Product) Class.forName(cls.getName()).newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return product;} }
-
- 测试
-
public class Test {public static void main(String[] args) {Product productA = Factory.createProductByType("ProductA");Product productB = Factory.createProductByType("ProductB");productA.display();productB.display();System.out.println("----------------------------------------");productA = Factory.createProductByClass(productA.getClass());productB = Factory.createProductByClass(productB.getClass());productA.display();productB.display();} }
This is product A This is product B ---------------------------------------- This is product A This is product B
-
优势和缺点
优势
- 将创建实例与使用实例分开,使用者不必关心类对象创建细节,实现了解耦
缺点
- 违背开闭原则,一旦添加新产品就得修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂
- 由于使用了静态方法,静态方法不能被继承和重写,会造成工厂类无法继承
应用场景
- 工厂类负责创建的产品对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂
- 客户端对于如何创建对象细节不关心:客户端不需要关心创建细节,只需要传输所对应的参数即可