工厂方法实质: 延迟到子类实现
代码示例:
/*产品接口及实现*/
public interface Product{
//属性及方法略
}
public class ConcreteProduct implements Product{
//属性及方法实现略
}
/*创建器,声明工厂方法*/
public abstract class Creator{
public voidoperation(){
Product api = factoryMethod();
//相关操作略
}
Protectedabstract Product factoryMethod();
}
/*创建器实现*/
public class ConcreteCreator implements Creator{
//重定义工厂方法,返回一个具体的Product对象
protectedProduct factoryMethod(){
return new ConcreteProduct();
}
}
模式讲解:
1. 认识工厂方法模式:
功能:让父类在不知道具体实现的情况下,完成自己的功能调用,而具体的实现延迟到子类的实现.这样在设计的时候不用去考考虑具体的实现,需要某个对象,通过工厂方法返回就可以了,在使用这些对象来实现功能的时候还是通过接口的实现的,这类似于IOC/DI的思想.
2. 实现成抽象类:
工厂方法的实现中,通常父类会使一个抽象类,里面包含创建所需对象的抽象方法,这些抽象方法就是工厂方法.
注意:子类在实现这些抽象方法的时候,并不是真正去实现具体的功能,而是在子类的方法里面做选择,选择具体的产品是实现对象.
父类里面通常会有使用这些产品对象来实现一定功能的方法,而且这些方法所实现的功能通常都是公共的功能,不管子类选择了何种具体的产品实现,这些方法的功能总是能正确执行
3. 实现成具体的类:
也可以把父类实现成一个具体的类,这种情况下通常是在父类中提供湖区所需产品的默认实现方法,这样即使没有具体的子类也能够运行
4. 工厂方法的参数和返回:
工厂方法的实现中可能需要参数以便决定创建哪一个具体的实现……一般工厂方法返回的是被创建对象的接口对象,当然也可以使抽象类或者一个具体的实现类.
5. 谁来使用工厂方法创建的对象:
事实上,在工厂方法里面应该是creator中的其他方法在使用工厂方法创建的对象,虽然也可以把工厂方法创建的对象直接提供给外部使用,但工厂方法模式的本意是由creator对象内部的方法使用工厂方法创建的对象,也就是说,工厂方法一般不提供给creator外部使用.
思考工厂方法模式:
1. 本质: 延迟到子类来选择实现,工厂方法本身并不会去实现产品接口,具体的产品实现是已经写好了的,工厂方法只要去选择实现就好了
2. 对设计原则的体现:工厂方法模式很好的体现了”依赖倒置原则”,依赖倒置原则而告诉我们”要依赖于抽象,不要依赖于具体类”,即不要让高层组件依赖于底层组件,而且不管是高层组件还是底层组件都应该依赖于抽象.