Java设计模式-3、简单工厂模式

本文详细介绍了Java中的简单工厂模式,包括模式定义、结构、代码实现及应用场景。简单工厂模式允许根据参数创建不同类的实例,这些实例通常具有共同的父类。通过配置文件可以灵活地切换和添加新产品,但缺点是工厂类职责过重,系统扩展困难。
摘要由CSDN通过智能技术生成

第3章:简单工厂模式

定义:

**简单工厂模式:**定义一个工厂类,它可以根据参数的不同,返回不同类的实例,被创建的实例通常都具有共同的父类。

结构:

image-20201031165312416

代码实现:

//抽象产品
abstract class Product {
    //所产品类的公共业务方法
    public void methodSame() {
        //公共方法的实现
    }
    //声明抽象业务方法
    public abstract void methodDiff();
}
//具体产品
class ConcreteProductA extends Product {

    @Override
    public void methodDiff() {

    }
}

//具体产品
class ConcreteProductB extends Product {
    @Override
    public void methodDiff() {

    }
}
//工厂类
class Factory {
    //静态工厂方法
    public static Product getProduct(String arg) {
        Product product = null;
        if (arg.equalsIgnoreCase("A")) {
            product = new ConcreteProductA();
        //初始化设置product
        }
        else if (arg.equalsIgnoreCase("B")) {
            product = new ConcreteProductB();
        //初始化设置product

        }
        return product;
    }
}

应用实例:

初始时:将所有图表的实现代码封装在一个Chart类中

class Chart {
    private String type; //图表类型

    public Chart(Object[][] data, String type) {
        this.type = type;
        if (type.equalsIgnoreCase("histogram")) {
            //初始化柱状图
        } else if (type.equalsIgnoreCase("pie")) {
            //初始化饼状图
        } else if (type.equalsIgnoreCase("line")) {
            //初始化折线图
        }
    }

    public void display() {
        if (this.type.equalsIgnoreCase("histogram")) {
            //显示柱状图
        } else if (this.type.equalsIgnoreCase("pie")) {
            //显示饼状图
        } else if (this.type.equalsIgnoreCase("line")) {
            //显示折线图
        }
    }
}

改进后:

image-20201031170500154

//抽象图表接口:抽象产品类
interface Chart {
    public void display();
}
//柱状图类:具体产品类
class HistogramChart implements Chart {
    public HistogramChart() {
        System.out.println("创建柱状图!");
    }
    public void display() {
        System.out.println("显示柱状图!");
    }
}
//饼状图类:具体产品类
class PieChart implements Chart {
    public PieChart() {
        System.out.println("创建饼状图!");
    }
    public void display() {
        System.out.println("显示饼状图!");
    }
}
//折线图类:具体产品类
class LineChart implements Chart {
    public LineChart() {
        System.out.println("创建折线图!");
    }
    public void display() {
        System.out.println("显示折线图!");
    }
}
//图表工厂类:工厂类
class ChartFactory {
    //静态工厂方法
    public static Chart getChart(String type) {
        Chart chart = null;
        if (type.equalsIgnoreCase("histogram")) {
            chart = new HistogramChart();
            System.out.println("初始化设置柱状图!");
        }
        else if (type.equalsIgnoreCase("pie")) {
            chart = new PieChart();
            System.out.println("初始化设置饼状图!");
        }
        else if (type.equalsIgnoreCase("line")) {
            chart = new LineChart();
            System.out.println("初始化设置折线图!");
        }
        return chart;
    }
}
//客户端
class Client {
    public static void main(String args[]) {
        Chart chart;
        chart = ChartFactory.getChart("histogram"); //通过静态工厂方法创建产品
        chart.display();
    }
}

再次改进:将静态工厂方法的参数存储在XML或properties格式的配置文件中

public class XMLUtils {
    //该方法用于从XML配置文件中提取图表类型,并返回类型名
    public static String getChartType() {
        try {
            //创建文档对象
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            Document doc;
            doc = builder.parse(new File("demo/src/config.xml"));
            //获取包含图表类型的文本节点
            NodeList nl = doc.getElementsByTagName("chartType");
            Node classNode = nl.item(0).getFirstChild();
            String chartType = classNode.getNodeValue().trim();
            return chartType;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

config.xml

<?xml version="1.0"?>
<config>
    <chartType>histogram</chartType>
</config>

客户端修改

class Client {
    public static void main(String args[]) {
        Chart chart;
        String type = XMLUtils.getChartType(); //读取配置文件中的参数
        chart = ChartFactory.getChart(type); //创建产品对象
        chart.display();
    }
}

简化简单工厂模式:将抽象产品类和工厂类合并,将静态工厂方法移 至抽象产品类

image-20201031171205419

优点:

  1. 工厂类包含必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的职责,而仅仅“消费”产品,简单工厂模式实现了对象创建和使用的分离。
  2. 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以在一定程度减少使用者的记忆量。
  3. 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

缺点:

  1. 由于工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响。
  2. 使用简单工厂模式势必会增加系统中类的个数(引入了新的工厂类,增加了系统的复杂度和理解难度。
  3. 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
  4. 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值