设计模式之简单工厂模式(含样例源码下载)
简单工厂模式的目的:使得对象的创建和使用分离,降低系统耦合,对用户隐藏类的实例创建细节
简单工厂模式属于创建型模式的一种
简单工厂模式的定义:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有相同的父类
简单工厂模式包含的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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南