类创建型设计模式:简单工厂模式

前言

本文章根据刘伟(Sunny) 的设计模式一书记录的笔记,感谢作者的知识分享。

工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式。本章将要学习的简单工厂模式是工厂方法模式的“小弟”,它不属于GoF 23种设计模式,但在软件开发中应用也较为频繁,通常将它作为学习其他工厂模式的入门。此外,工厂方法模式还有一位“大哥”——抽象工厂模式。这三种工厂模式各具特色,难度也逐个加大,在软件开发中它们都得到了广泛的应用,成为面向对象软件中常用的创建对象的工具。

定义

简单工厂模式:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式

简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。简单工厂模式结构比较简单,其核心是工厂类的设计。

实现

在简单工厂模式结构图中包含如下几个角色:

  • Factory(工厂角色):工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑;工厂类可以被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它的返回类型为抽象产品类型Product。
  • Product(抽象产品角色):它是工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象。
  • ConcreteProduct(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。

在简单工厂模式中,客户端通过工厂类来创建一个产品类的实例,而无须直接使用new关键字来创建对象,不需要考虑这个产品是如何生成的.客户端得到产品之后,可以直接使用.

模式结构图如图:
在这里插入图片描述

对比

不使用设计模式:
在这里插入图片描述
产品类十分庞大复杂,需要扩展时,就需要重新修改产品类的代码,同时里面包含大量的if-else代码.

使用简单工厂模式重构:

	//抽象图表接口:抽象产品类  
	interface Chart {  
	    public void display();  
	}  
	
	//柱状图类:具体产品类  
	class HistogramChart implements Chart {  
	    public HistogramChart() {  
	        System.out.println("创建柱状图!");  
	    }  
	
	    public void display() {  
	        System.out.println("显示柱状图!");  
	    }  
	}  
	
	//饼状图类:具体产品类  
	class PieChart implements Chart {  
	    public PieChart() {  
	        System.out.println("创建饼状图!");  
	    }  
	
	    public void display() {  
	        System.out.println("显示饼状图!");  
	    }  
	}  
	
	//折线图类:具体产品类  
	class LineChart implements Chart {  
	    public LineChart() {  
	        System.out.println("创建折线图!");  
	    }  
	
	    public void display() {  
	        System.out.println("显示折线图!");  
	    }  
	}  
	
	//图表工厂类:工厂类  
	class ChartFactory {  
	    //静态工厂方法  
	    public static Chart getChart(String type) {  
	        Chart chart = null;  
	        if (type.equalsIgnoreCase("histogram")) {  
	            chart = new HistogramChart();  
	            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;  
	    }  
	}
	class Client {  
	    public static void main(String args[]) {  
	        Chart chart;  
	        chart = ChartFactory.getChart("histogram"); //通过静态工厂方法创建产品  
	        chart.display();  
	    }  
	}

每次需要扩展增加新的产品的时候,只需要继承产品接口,修改工厂类中的代码就可以实现扩展.

总结

Sunny软件公司开发人员发现在创建具体Chart对象时,每更换一个Chart对象都需要修改客户端代码中静态工厂方法的参数,客户端代码将要重新编译,这对于客户端而言,违反了“开闭原则”.

简单工厂模式提供了专门的工厂类用于创建对象,将对象的创建和对象的使用分离开,它作为一种最简单的工厂模式在软件开发中得到了较为广泛的应用。

  • 简单工厂模式的主要缺点如下:
    (1) 由于工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响。
    (2) 使用简单工厂模式势必会增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度。
    (3) 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
    (4) 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。
  • 适用场景
    在以下情况下可以考虑使用简单工厂模式:
    (1) 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
    (2) 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝多芬也爱敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值