工厂方法模式
为什么引入工厂方法模式?
当我们需要创建多个实例的时候,而这些类又是有着公共的方法,区别就是实现的具体操作不同,我们需要专门为这些类创建实例,但是,如果我们没有创建这些的类的权限的时候,(并不是说我们真没有new方法,而是外在的因素)我们需要找一个可以帮我们生产对象的工具,这个听起来和代理模式有些相似,但是工厂模式也是工厂代替我们生产我们需要的实例,工厂模式生成的对象之间是相似的,都是实现相同接口的类。
同时对于需求来说,当我们想创建某个实例,但是我们只知道他的某个特性,对于具体的信息我们又不知道,我们需要一个根据我们知道的请求,帮助我们创建一个对象,实现具体的细节帮,这个角色就是工厂模式。
工厂方法模式是什么?
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
工厂方法模式的核心思想?
存在一个公共的接口,多个实现类实现这个接口,存在一个工厂类,这个类根据不同的参数创建不同的实现类。
具体案例?
某个学校需要一套校服,校服分为男士校服,和女士校服,将这个任务交给厂商,具体的生产交给厂商实现,学校只需要告诉生产商男士穿还是女士穿。
UML:
具体代码:
package com.dong.Factory;
public interface Clothers {
public void toSay();
}
package com.dong.Factory;
public class ManType implements Clothers{
@Override
public void toSay() {
System.out.println("I am super man");
}
}
package com.dong.Factory;
public class WomanType implements Clothers {
@Override
public void toSay() {
System.out.println("I am super Girl");
}
}package com.dong.Factory;
/**
*
* 运行结果:
* I am super man
I am super Girl
* @author liuD
*
*/
public class Factory {
public static Clothers createClother(String type) {
if( type.toLowerCase().equals("man"))
return new ManType();
else if( type.toLowerCase().equals("woman"))
return new WomanType();
else {
System.out.println("please input the Correct String ");
return null;
}
}
public static void main(String[] args) {
Clothers manClother = Factory.createClother("man");
manClother.toSay();
Clothers womenClother = Factory.createClother("woman");
womenClother.toSay();
}
}
优点
具体的实现由工厂代替,请求者只需要调用工厂的创建方法。
横向实现比较容易。要创建一个新的类,但是方法和原来的相同,只不过内容不同,这个时候,只需要实现公共接口即可,工厂就可以实现这个实例的创建。
缺点
当需要改变需求,创建具有其他操作的实例的时候,不仅需要改动接口,还需要改动已经实现的类,扩展不方便,只能创建具有相同操作的实例,
使用场景
当需要灵活的,可扩展的框架时,可以考虑采用工厂模式,
当实例对象的具体创建权不在类本身,而实例对象之间又有相同的操作,则可以使用工厂方法根据特定的条件来创建具体的实例。