简单工厂模式(Simple Factory)

定义与类型

定义:由一个工厂对象决定创建出哪一种产品类的实例

类型:创建型,但不属于GOF23种设计模式

适用场景

  • 工厂类负责创建的对象比较少

  • 客户端(应用层)只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心

优点

只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节

缺点

工厂类的职责相对过重,增加新的产品时,需要修改工厂类的判断逻辑,违背开闭原则

简单工厂代码示例

在这里插入图片描述

Video.java

package com.czh.creational.simplefactory;

public abstract class Video {
   
    public abstract void play();
}

JavaVideo.java

package com.czh.creational.simplefactory;

public class JavaVideo extends Video {
   
    @Override
    public void play() {
   
        System.out.println("播放Java视频");
    }
}

PythonVideo.java

package com.czh.creational.simplefactory;

public class PythonVideo extends Video {
   
    @Override
    public void play() {
   
        System.out.println("播放Python视频");
    }
}

VideoFactory.java

package com.czh.creational.simplefactory;

public class VideoFactory {
   
    public Video getVideo(String type) {
   
        if ("java".equalsIgnoreCase(type)) {
   
            return new JavaVideo();
        } else if ("python".equalsIgnoreCase(type)) {
   
            return new PythonVideo();
        }
        return null;
    }
}

Test.java

package com.czh.creational.simplefactory;

public class Test {
   
    public static void main(String[] args) {
   
        VideoFactory videoFactory = new VideoFactory();
        Video video = videoFactory.getVideo("java");
        if (video == null) {
   
            return;
        }
        video.play();
    }
}

使用反射演进简单工厂

Video.java

package com.czh.creational.simplefactory;

public abstract class Video {
   
    public abstract void play();
}

JavaVideo.java

package com.czh.creational.simplefactory;

public class JavaVideo extends Video {
   
    @Override
    public void play() {
   
        System.out.println("播放Java视频");
    }
}

PythonVideo.java

package com.czh.creational.simplefactory;

public class PythonVideo extends Video {
   
    @Override
    public void play() {
   
        System.out.println("播放Python视频");
    }
}

VideoFactory.java

package com.czh.creational.simplefactory;

public class VideoFactory {
   
    public Video getVideo(Class c) {
   
        Video video = null;
        try {
   
            video = (Video) Class.forName(c.getName()).newInstance();
        } catch (InstantiationException e) {
   
            e.printStackTrace();
        } catch (IllegalAccessException e) {
   
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
   
            e.printStackTrace();
        }
        return video;
    }
}

Test.java

package com.czh.creational.simplefactory;

public class Test {
   
    public static void main(String[] args) {
   
        VideoFactory videoFactory = new VideoFactory();
        Video video = videoFactory.getVideo(JavaVideo.class);
        if (video == null) {
   
            return;
        }
        video.play();
    }
}

相关推荐

  1. 简单工厂模式

    2023-12-27 15:32:02       40 阅读
  2. 设计模式-简单工厂

    2023-12-27 15:32:02       33 阅读
  3. 简单工厂模式

    2023-12-27 15:32:02       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-27 15:32:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-27 15:32:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-27 15:32:02       82 阅读
  4. Python语言-面向对象

    2023-12-27 15:32:02       91 阅读

热门阅读

  1. 初识k8s

    初识k8s

    2023-12-27 15:32:02      58 阅读
  2. Adobe Application Manager丢失或损坏 - 解决方案

    2023-12-27 15:32:02       117 阅读
  3. 四种NAT的网络结构

    2023-12-27 15:32:02       56 阅读
  4. electron DownloadItem如何从指定Url中下载文件

    2023-12-27 15:32:02       53 阅读
  5. 软件测试面试题——如果保证测试用例覆盖率

    2023-12-27 15:32:02       55 阅读
  6. CSS3-——过渡

    2023-12-27 15:32:02       55 阅读
  7. SQL语言之DDL

    2023-12-27 15:32:02       54 阅读