02.简单工厂模式(创建型)

2019-06-28  本文已影响0人  哈哈大圣

创建型模式-简单工厂模式

一、入门

由于创建实例的方法是静态方法,因此又叫静态工厂方法

  1. 定义:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
  2. 要点:需要什么,传入一个正确的参数即可获取所需对象,无需知道创建细节。

二. 角色

![简化的简单工厂模式.png](https://img.haomeiwen.com/i14371562/467bceb128fbad3f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  1. Factory(工厂角色):工厂类,简单工厂模式的核心,在工厂类中提供了静态的工厂方法factoryMethod(),它的返回类型为抽象产品类型Product
  2. Product(抽象产品角色):工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法
  3. ConcreteProduct(具体产品角色):简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。

三、典型的抽象产品类代码

  1. 产品抽象类
abstract class Product {

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

当增加实现类,得该源码,不符合开闭原则,需要优化

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;
    }
}
  1. 客户端代码
class Client {
    public static void main(String args[]) {
        Chart chart;
        String type = XMLUtil.getChartType(); //读取配置文件中的参数
        chart = ChartFactory.getChart(type); //创建产品对象
        chart.display();
    }
}
  1. 配置类
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
public class XMLUtil {
    //该方法用于从XML配置文件中提取图表类型,并返回类型名
    public static String getChartType() {
        try {
            //创建文档对象
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            Document doc;
            doc = builder.parse(new File("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;
        }
    }
}
  1. 配置文件
<?xml version="1.0"?>
<config>
    <chartType>histogram</chartType>
</config>

四、简单工厂模式的简化

将抽象产品类和工厂类合并,将静态工厂方法移至抽象产品类中

简化的简单工厂模式.png

五、简单工厂模式的优缺点

1). 优点

  1. 对象创建和实用的分离
  2. 创建对象配置即可,无需记住需要创建实例的全类名,对开发者友好。
  3. 实现了一定程度的开闭原则

2). 缺点

  1. 工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响。
  2. 增加了系统中类的个数,系统复杂性和理解难度提高。
  3. 系统拓展困难,一旦添加新的产品,不得不改源码,违反了开闭原则,不利于系统的拓展和维护。
  4. 简单工厂模式使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

六、简单工厂模式的适用场景

  1. 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
  2. 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。
上一篇 下一篇

猜你喜欢

热点阅读