引言:让我们重温经典,致敬经典
工厂方法模式:定义一个用于创建对象的接口,让子类来决定实例化哪一个类,工厂方法使一个类的实例化延迟到了子类。
UML图:
1 package com.dzf.designtest; 2 3 /** 4 * <desc> 5 * 工厂方法:定义一个创建对象的接口,让子类来决定实例化哪一个类,工厂方法使一个类的实例延迟到子类。 6 * </desc> 7 * @author dingzf 8 * @date 2018/4/1 9 * @time 21:42 10 */ 11 public class FactoryMethodDmeo { 12 //客户端 13 public static void main(String[] args) { 14 ProductFactory productFactory = new ProductImplOneFactory(); 15 Product product = productFactory.getInstance(); 16 product.operation(); 17 } 18 } 19 20 abstract class Product { 21 public abstract void operation(); 22 } 23 24 class ProductImplOne extends Product { 25 @Override 26 public void operation() { 27 System.out.println("我是产品1号"); 28 } 29 } 30 31 class ProductImplTwo extends Product { 32 @Override 33 public void operation() { 34 System.out.println("我是产品2号"); 35 } 36 } 37 38 interface ProductFactory { 39 //定义创建对象的接口,再子类中去实例化目标对像 40 public Product getInstance(); 41 } 42 class ProductImplOneFactory implements ProductFactory { 43 //子类实例化目标对象 44 @Override 45 public Product getInstance() { 46 return new ProductImplOne(); 47 } 48 } 49 class ProductImplTwoFactory implements ProductFactory{ 50 //子类实例化目标对象 51 @Override 52 public Product getInstance() { 53 return new ProductImplTwo(); 54 } 55 }
解读:我们知道简单工厂模式和工厂方法模式很像,但是又不同。
简单工厂最大的优点在于工厂类中包含了必要性的逻辑判断,根据客户端的选择动态的实例化对象,对于客户端来说,去除了和具体产品的依赖。但是我们增加功能的时候,是要改变工厂类中的逻辑判断的。这就违背了开放封闭原则。于是工厂方法就来了。记得在开放封闭原则那篇里说过,在刚开始的时候,我们不知道什么是会变的,很难预测,当类中的某些行为发生变化的时候,我们可以把这些抽象出来,防止以后发生同样的变化。工厂方法模式就是对这句话的诠释!
工厂方法模式是简单工厂的进一步抽象,由于使用多态,保持了原有简单工厂的优点,而且客服了它的缺点,但是每增加一个产品,就需要增加一个与之相对应的工厂类,额外的增加了开发的工作量。有没有更两全齐美的办法呢,答案肯定是有的。不在本篇范围了,后面再说吧!
工厂方法就先到这吧。