• 设计模式之简单工厂模式(含样例源码下载)


    简单工厂模式的目的:使得对象的创建和使用分离,降低系统耦合,对用户隐藏类的实例创建细节

     

    简单工厂模式属于创建型模式的一种

     

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

     

    简单工厂模式包含的3个角色:

    1)工厂角色:即工厂类,负责实现创建所有产品实例的内部逻辑

    2)抽象产品角色:工厂类创建的所有对象的父类,封装了各种产品对象公有的方法

    3)具体产品角色::工厂需要创建的东西,继承了抽象产品角色,需要实现抽象产品角色中声明的抽象方法

     

    在没有工厂类之前客户端一直使用new关键字直接创建产品对象,而在引入了工厂类之后客户端可以通过工厂类来创建产品,根据传入不同的参数创建不同的产品对象

     

    实例如下:

    实例说明:建立一个图表库,目前有三种图表,柱状图(HistongramChart),饼状图(PieChart),折线图(LineChart),要求方便进行扩展!

    1.抽象图表接口,充当抽象产品类

    package 简单工厂模式;
    /**
     *@author YB
     *@version 2019年3月15日下午6:17:29    
     */
    /*
     * 抽象图表接口,充当抽象产品类 ,具体产品类必须实现抽象产品类实现的方法
     */
    public interface Chart {
        public void display();
    }

    2.柱状图类,充当具体产品类

    package 简单工厂模式;
    /**
     *@author YB
     *@version 2019年3月15日下午6:19:29    
     */
    /*
     * 柱状图类,充当具体产品类
     */
    public class HistongramChart implements Chart{
    
        public HistongramChart() {
            // TODO Auto-generated constructor stub
            System.out.println("创建柱状图");
        }
        @Override
        public void display() {
            // TODO Auto-generated method stub
            System.out.println("显示柱状图");
        }
    
    }

    3.饼状图类,充当具体产品类

    package 简单工厂模式;
    /**
     *@author YB
     *@version 2019年3月15日下午6:22:30    
     */
    /*
     * 饼状图类,充当具体产品类
     */
    public class PieChart implements Chart{
    
        public PieChart() {
            // TODO Auto-generated constructor stub
            System.out.println("创建饼状图");
        }
        @Override
        public void display() {
            // TODO Auto-generated method stub
            System.out.println("显示饼状图");
        }
    
    }

    4.折线图类,充当具体产品类

    package 简单工厂模式;
    /**
     *@author YB
     *@version 2019年3月15日下午6:24:37    
     */
    /*
     * 折线图类,充当具体产品类
     */
    public class LineChart implements Chart {
    
        public LineChart() {
            // TODO Auto-generated constructor stub
            System.out.println("创建折线图");
        }
        @Override
        public void display() {
            // TODO Auto-generated method stub
            System.out.println("显示折线图");
        }
    
    }

    5.图表工厂类,根据传入的不同字符创建不同的产品

    package 简单工厂模式;
    /**
     *@author YB
     *@version 2019年3月15日下午6:28:05    
     */
    /*
     * 图表工厂类,根据传入的不同字符创建不同的产品
     * String.equalsIgnoreCase 不区别大小写
     */
    public class ChartFactory {
        
        public static Chart getChart(String type) {//静态工厂方法
            Chart chart=null;
            if(type.equalsIgnoreCase("histogram")) {
                chart=new HistongramChart();
                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;
        }
    }

    6.客户端测试类

    package 简单工厂模式;
    /**
     *@author YB
     *@version 2019年3月15日下午7:01:31    
     */
    /*
     * 客户端测试类
     */
    public class Client {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Chart chart;
            /*
             * 只需修改配置文件,无需修改任何代码,符合开闭原则
             */
            String type=XMLUtil.getCharType();//读取配置文件中的参数 
            chart=ChartFactory.getChart(type);//创建产品对象
            chart.display();
        }
    
    }

    7.XMLUtil工具类:读取配置文件中的字符

    package 简单工厂模式;
    
    import java.io.File;
    
    import javax.swing.text.Document;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.soap.Node;
    
    import org.w3c.dom.NodeList;
    
    /**
     *@author YB
     *@version 2019年3月15日下午7:08:17    
     */
    public class XMLUtil {
        //该方法用于从XML配置文件中提取图表类型,并返回类型名
        public static String getCharType() {
            try {
                //创建文档对象
                DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();
                DocumentBuilder builder=dFactory.newDocumentBuilder();
                org.w3c.dom.Document doc=builder.parse(new File("src//简单工厂模式//config.xml"));
                
                //获取包含图表类型的文本节点
                NodeList nlList= doc.getElementsByTagName("charType");
                org.w3c.dom.Node classNode=nlList.item(0).getFirstChild();
                String charType=classNode.getNodeValue().trim();
                return charType;
                
            }catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                return null;
            }
        }
    }

    8.配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <config>
    <charType>pie</charType>
    </config>

    简单工厂模式的优点:

    1.工厂类包含必要的判断逻辑,可以决定什么时候创建哪一个产品的实例,客户端可以免除直接创建产品对象,而仅仅负责消费产品

    2.引入配置文件,可以在不修改客户端代码的情况下更换和增加新的具体产品类

    简单工厂模式的缺点:

    1.工厂类职责过重,一旦工厂类出问题会影响很大

    2.会增加系统中类的个数(引入新的工厂类)增加系统复杂度

    3.系统扩展困难,一旦添加新产品就要修改工厂类的逻辑,产品类较多时逻辑会比较复杂

     

    代码下载:链接:https://share.weiyun.com/5NiEhDD 密码:tyh9u5

  • 相关阅读:
    分享一个流程实例运行时出现异常的恢复方案
    为什么要从事BPM开发
    分享两个BPM配置小技巧
    说说BPM数据表和日志表中几个状态字段的详细解释
    流程表单中js如何清空SheetUser控件数据?
    如何解决流程开发中SheetRadioButtonList页面取值问题
    把一个syn报文给rst掉
    linux io的cfq代码理解一
    xfs 的一些工具使用
    你知道这段代码为什么会段错误么?
  • 原文地址:https://www.cnblogs.com/yinbiao/p/10539258.html
Copyright © 2020-2023  润新知