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

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

 

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

 

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

 

简单工厂模式包含的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

posted @ 2019-03-15 20:12  西*风  阅读(735)  评论(0编辑  收藏  举报