目录
一、什么是工厂方法模式
工厂方法模式又被称为多态工厂模式 。
工厂方法模式的意义是定义一个创建产品对象的工厂接口,让子类决定实例化哪一个类,将实际创建工作推迟到子类当中。
核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
二、模式中包含的角色及其职责
1.抽象工厂(Creator)角色
工厂方法模式的核心,任何工厂类都必须实现这个接口。
2.具体工厂( Concrete Creator)角色
具体工厂类是抽象工厂的一个实现,负责实例化产品对象。 覆盖实现Creator定义的工厂方法,返回具体的Product实例
3.抽象(Product)角色
工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
4.具体产品(Concrete Product)角色
工厂方法模式所创建的具体实例对象
三、工厂方法模式和简单工厂模式比较
工厂方法模式与简单工厂模式在结构上的不同不是很明显。
工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具 体类上。
工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工 厂类都有共同的接口,或者有共同的抽象父类。 当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对 象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了“开放-封闭”原则。而简单工厂 模式在添加新产品对象后不得不修改工厂方法,扩展性不好。 工厂方法模式退化后可以演变成简单工厂模式。
四、理解工厂方法模式
认识工厂方法
1.工厂方法模式功能
主要功能是让父类不知道具体实现的情况下,完成自身的功能调用,而具体的实现延迟到子类来实现
2.实现抽象类
工厂方法的实现中,通常父类会是一个抽象类,里面包含创建所需对象的抽象方法,这些抽象方法就是工厂方法。
3.实现成具体的类
也可以把父类实现成为一个具体的类,这种情况下,通常是在父类中提供获取所需对象的默认实现方法,这样就算没有具体的子类,也能运行
4.参数和返回值
可能需要参数来决定到底调用哪一种具体实现
一般返回的是被创建的接口对象,也可能是抽象类或具体类的实例
5.谁使用工厂方法创建的对象
在工厂方法模式里,应该是Creator中的其他方法在使用工厂方法创建的对象
客户端应该使用Creator对象,或者是使用Creator创建出来的对象,这时候工厂方法创建出来的对象,是Creator中的某些方法的使用
在某些情况下,客户端可能会使用由Creator创建出来的对象,这个时候工厂方法创建的对象,是构成客户端所需要对象的一部分
总结:在工厂方法模式里,客户端要么使用Creator对象,要么使用Creator创建出来的对象,一般客户端不直接使用工厂方法。也可以直接把工厂方法暴露给客户端操作。
工厂方法模式与IoC\DI
没有IoC/DI的时候,A类使用C类需要主动去创建
有了容器后,A不再主动创建C,而是被动等待,等待容器获取一个C的实例,然后反向注入到A类中。这样A和C就不再有依赖关系,做到了松耦合。
工厂方法模式和IoC/DI思想类似,都是“主动变被动”,进行“主从换位”,从而获得更灵活的程序结构。
平行的类层次结构
1.什么是平行的类层次结构
假如有两个类层次结构,其中一个类层次结构的每一个类在另一个类层次中都有一个对应的类层次结构,就称为平行的类层次结构。
2.作用
主要用来把一个类层次中的某些行为分离出来,让类层次中的类把原本属于自己的职责,委托给分离出去的类去实现,从而使得类层次本身变得更简单,容易扩展和复用。
3.和工厂方法模式的关系
可以使用工厂方法模式来连接平行的类层次
参数化工厂方法
通过给工厂方法传递参数,让工厂方法根据不同参数来创建不同对象
工厂方法模式优缺点
1.可以在不知道具体实现情况下编程
2.容易扩展
3.连接平行的类层次
4.具体产品对象和工厂方法具有耦合性
思考工厂方法模式
本质
延迟到子类来选择实现
对设计原则的体现
依赖倒置原则
何时选用
1.一个类需要创建某个接口对象,但是又不知道具体实现,可以选用工厂方法模式,把创建对象的工作延迟到子类来实现
2.一个类本身就希望由它的子类来创建对象,可以使用