-
简单工厂模式(Simple Factory Pattern)是指由一个工厂对象决定创建哪一种产品类的实例,但它不属于GoF的23种设计模式,简单工厂模式适用于工厂类负责创建对象较小的场景,且客户端只需要传入工厂类的参数,对于如何创建对象不需要关心
-
我们来看代码:
pubic interface ILanguage{
//学习语言
public void study();
}
- 创建一个Java语言实现Language类
public class Java implements ILanguage{
public void study(){
System.out.println("学习Java语言");
}
}
- 客户端调用代码
pubic static void main (String[] args){
ILanguage language = new Java();
language.study();
}
- 在上面的代码中,父类ILanguage 指向子类Java的引用,应用层代码需要依赖Java,如果业务扩展,继续增加Python甚至更多语言,那么客户端会变得非常臃肿,因此,我们要把这种依赖减弱,把创建的细节因此,现在我们用简单工厂模式对代码进行优化。
- 先增加课程类Python
public class Python implements ILanguage{
public void study(){
System.out.println("学习Python语言");
}
}
- 创建工厂类LanguageFactory
public class LanguageFactory{
public ILanguage create(String name){
if("java".equals(name)){
return new Java();
}else if("python".equals(name)){
return new Python();
}else{
return null;
}
}
}
- 客户端修改代码如下:
public static void main (String[] args){
LanguageFactory factory = new LanguageFactory();
factory.create("java");
}
-
下面我们看下类图
-
客户端调用变简单了,但是如果我们业务继续扩展,要增加前端语言,那么工厂里的create岂不是一直修改,不符合开闭原则,因此,我们还可以对简单工厂模式继续优化,采用反射技术
public class LanguageFactory{
public ILanguage create(String cassName){
try(){
if(StringUtils.isNotEmpty(name)){
return (ILanguage) Class.forName(className).newInstance();
}
}catch(Exception e){
e.printStackTrace();
}
return null;
}
}
- 修改客户端代码
public static void main (String[] args){
LanguageFactory factory = new LanguageFactory();
ILanguage language = factory.create("com.example.designPattern.simpleFactoryPattern.Java");
language.study();
}
-优化之后,产品不断迭代,方法参数是字符串,可控性较差,还需要强制转换类型,继续整
public ILanguage create(Class<? extends ILanguage> clazz){
try{
if(null != clazz){
return clazz.newInstance();
}
}catch(Exception e){
e.printStackTrace();
}
return null;
}
- 优化客户端代码
public static void main (String[] args){
LanguageFactory factory = new LanguageFactory();
ILanguage language = factory.create(Java.class);
language.study();
}
-
类图如下
-
简单工厂模式在JDK源码下的应用
-
Logger
-
简单工厂模式的缺点,工厂类的职责相对过重,不易于扩展。
-
下期 工厂方法模式