一、介绍
从名称上,顾名思义就是创建产品,按类别分为简单工厂模式、工厂方法模式、抽象工厂模式,主要功能都是帮助我们把对象的实例化操作单独抽取出来,优化系统架构,增强系统的扩展性。
下面,我们一起来看看各个模式的使用方式。
二、简单工厂模式
简单工厂模式,对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象。
- 创建一个接口
public interface Product { void operation1(); void operation2(); }
- 创建实现接口的实体类
public class ConcreateProductA implements Product{ @Override public void operation1() { System.out.println("产品A,执行任务1"); } @Override public void operation2() { System.out.println("产品A,执行任务2"); } }
public class ConcreateProductB implements Product{ @Override public void operation1() { System.out.println("产品B,执行任务1"); } @Override public void operation2() { System.out.println("产品B,执行任务2"); } }
- 创建一个工厂,生成基于给定信息的实体类的对象
public class SimpleFactory { //使用 create 方法获取形状类型的对象 public Product create(String productType){ if(productType == null){ return null; } if(productType.equalsIgnoreCase("productA")){ return new ConcreateProductA(); } if(productType.equalsIgnoreCase("productB")){ return new ConcreateProductB(); } return null; } }
- 编写客户端测试类,使用该工厂,通过传递类型信息来获取实体类的对象
public class FactoryPatternDemo { public static void main(String[] args) { SimpleFactory simpleFactory = new SimpleFactory(); //获取 productA 的对象 Product productA = simpleFactory.create("productA"); //调用 productA 的 operation1、operation2 方法 productA.operation1(); productA.operation2(); //获取 productB 的对象 Product productB = simpleFactory.create("productB"); //调用 productB 的 operation1、operation2 方法 productB.operation1(); productB.operation2(); } }
- 执行程序,输出结果:
产品A,执行任务1 产品A,执行任务2 产品B,执行任务1 产品B,执行任务2
当然,还可以将创建对象方式进行改进,将SimpleFactory
类创建对象的方式改成如下方式:
public class SimpleFactory { //反射机制获取实体类 public <T> T createByClazzName(Class<? extends T> clazz){ T obj = null; try { obj = (T) Class.forName(clazz.getName()).newInstance(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return obj; } }
这样做的好处是,当有新的产品加入时,不用修改工厂类,在调用的时候,采用如下方式即可获取对象!
Product product = new SimpleFactory().create("类名.class");
三、工厂方法模式
和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂。
- 创建一个工厂接口
public interface FactoryProduct { Product create(); }
- 创建实现接口的实体类
public class ConcreateFactoryA implements FactoryProduct{ @Override public Product create() { return new ConcreateProductA(); } }
public class ConcreateFactoryB implements FactoryProduct{ @Override public Product create() { return new ConcreateProductB(); } }
- 编写客户端测试类,使用该工厂,通过传递类型信息来获取实体类的对象
public class FactoryPatternDemo { public static void main(String[] args) { //获取 productA 的对象 Product productA = new ConcreateFactoryA().create(); //调用 productA 的 operation1、operation2 方法 productA.operation1(); productA.operation2(); //获取 productB 的对象 Product productA = new ConcreateFactoryB().create(); //调用 productB 的 operation1、operation2 方法 productB.operation1(); productB.operation2(); } }
- 执行程序,输出结果:
产品A,执行任务1 产品A,执行任务2 产品B,执行任务1 产品B,执行任务2
四、抽象工厂模式
抽象工厂模式主要是应对产品族概念提出来的。提供一个创建一系列相关或相互依赖的对象。
- 为形状创建一个接口
public interface Shape { void draw(); }
- 创建实现接口的实体类
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } }
public class Square implements Shape { @Override public void draw() { System.out.println("Inside Square::draw() method."); } }
public class Circle implements Shape { @Override public void draw() { System.out.println("Inside Circle::draw() method."); } }
- 为颜色创建一个接口
public interface Color { void fill(); }