简单工厂模式-java

236 阅读2分钟

简单工厂模式

简单工厂模式结构:

1、抽象产品:描述了产品的主要功能和特性
2、具体产品:实现或者继承抽象产品的子类(有时候适合用接口实现,有时候适合用抽象类实现)
3、具体工厂:提供创建产品的方法

场景模拟

    我们需要一个读取文件的工具类,目前这个工具类需要可以读取图片、和文字,以后可能还会随着业务发展扩展这个类,
那我们要怎么设计呢?
 
    首先设计一个读取文件的工具类接口ReadFile,里面提供读取的方法。然后再设计一个读取图片的类ReadFileImg它实
现ReadFile接口,然后在设计一个读取文本的类ReadFileText它也实现ReadFile。在设计一个具体工厂类FilesFactory
用来创建工具类。

    抽象产品:ReadFile
    具体产品:ReadFileImg 
    具体产品:ReadFileText 
    具体工厂:FilesFactory

类图

001.PNG

抽象产品:ReadFile代码

// 抽象产品
public interface ReadFile {
    void read();
}

具体产品:ReadFileImg代码

// 具体产品(读取图片的类)
public class ReadFileImg implements ReadFile {
    @Override
    public void read() {
        System.out.println("读取图片完成...");
    }
}

具体产品:ReadFileText

// 具体产品(读取文本的类)
public class ReadFileText implements ReadFile {
    @Override
    public void read() {
        System.out.println("读取文本完成...");
    }
}

具体工厂:FilesFactory

// 具体工厂类
public class FilesFactory {
    public static ReadFile createBean(String type) {
        ReadFile readFile = null;

        if("img".equals(type)) {  // 创建读取图片的类对象
            readFile = new ReadFileImg();
        }else if("text".equals(type)) {  // 创建读取文本的类对象
            readFile = new ReadFileText();
        }else { // 其他情况抛异常
            throw new RuntimeException("不能正常创建对象!");
        }

        return readFile;
    }
}

测试代码

// 测试类
public class Test {
    public static void main(String[] args) {
        // 创建读取图片的类对象
        ReadFile readFile = FilesFactory.createBean("img");
        // 开始读取图片
        readFile.read();
    }
}

运行结果

image.png

优缺点

1、优点:扩展新功能时更容易扩展
2、缺点:增加新功能时还是需要修改工厂类的代码,违背了“开闭原则”。