简单工厂模式又叫又叫做静态工厂方法(StaticFactory Method)模式,说直白点就是调用一个类的静态方法,这个静态方法根据不同的情况创造不同的对象给客户端,而这个类就为工厂类.说的可能有点绕,其实就是一个类根据你传递给他的判断参数进行对象实例的创建,而创建的过程一般都进行向上转型为.具体见下面示例.
如果觉得这说的没意思,可以直接看下面红色扯淡部分,通俗易懂。
最顶层的抽象类:
package com.SimpleFactory;
public abstract class AbstractClass {
}
继承上述抽象类的子类1:
package com.SimpleFactory;
public class AbstractClass1 extends AbstractClass {
@Override
public String toString() {
System.out.println("AbstractClass1");
return "AbstractClass1";
}
}
子类2:
package com.SimpleFactory;
public class AbstractClass2 extends AbstractClass {
@Override
public String toString() {
System.out.println("AbstractClass1");
return "AbstractClass1";
}
}
制造对象的工厂:
package com.SimpleFactory;
public class CreateFactory {
public static AbstractClass getInstance(String arg) {
// 如果传入的参数为“1”则创建AbstractClass1对象给客户端
if (arg != null && "1".equals(arg)) {
return new AbstractClass1();
// 如果传入的参数为“2”则创建AbstractClass2给客户端
} else if(arg != null && "2".equals(arg)) {
return new AbstractClass2();
} else {
return null;
}
}
}
如果有新的情况,即有新的子类需要被创建时,需要在工厂类中添加相应的判断分支(这个是简单工厂模式的一个缺点),上述分支是用if else书写的,可以用其它方式进行判断。
简单工厂模式其实是个创造型模式,是负责制造的,上面的例子过于简单,只是为了说明情况。
说的再通俗一点,比如有一个学生的抽象类,有学生类张三继承了学生抽象类,张三踢足球,有学生类李四类继承了学生抽象类,李四类打篮球,有具体类王五,王五会打台球,王五类也继承了学生抽象类,当有一天,学校跟外校搞场友谊赛,每场需要派不同的学生上场,这时候学校就要根据不同的情况创建学生对象去参加某种比赛,如当为篮球比赛的时候就需要创建李四,当为台球时候就派王五,同理如果是足球比赛就派张三,这就是一个简单工厂模式,一个创造型模式,假设学校是学生的制造工厂 如下
public class School {
public static 学生 getInstance(球类){
if(篮球){
renturn 创建de李四
}else if (足球){
return 创建de张三
} else if (台球) {
return 创建de王五
} else {
return 创建神(神继承了学生。。。)
}
}}
上面所有提到的抽象类的地方都可以用接口代替,这要看具体的业务需求要看是否有些共性的东西可以向上转移到超类中去实现
简单工厂模式的UML类图
类图说明如下 Product_A、Product_B实现了IProduct接口当Create创建的时候创建的是超类行,但实际超类行赋值操作赋的是具体的子类对象。