简单工厂模式

  • 简单工厂模式(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

  • 简单工厂模式的缺点,工厂类的职责相对过重,不易于扩展。

  • 下期 工厂方法模式

发布了6 篇原创文章 · 获赞 8 · 访问量 3151
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章