美文网首页
02.简单工厂模式(创建型)

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

作者: 哈哈大圣 | 来源:发表于2019-06-28 22:52 被阅读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. 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。

    相关文章

      网友评论

          本文标题:02.简单工厂模式(创建型)

          本文链接:https://www.haomeiwen.com/subject/srvycctx.html