【学习】理解工厂模式


11.30占个坑 先只写抽象工厂模式(刚刚写完作业? 12.5补充其它工厂模式的内容

简单工厂模式

以作业为例:在开发部门,不同类型的职员有着不同的薪水:
在这里插入图片描述
与client交互的指令如下:
在这里插入图片描述
在这里插入图片描述
下图为最初的类图,缺点在于,用户不仅需要知道接口是什么,还需要理解实现接口的类是什么。所以我们需要实现一个被接口封装好的类,可以实现与用户的隔离,用户不需要知道该接口具体的实现类是什么。
在这里插入图片描述

为了解决上述所说的问题,提出了简单工厂模式,创建一个工厂类来执行创建对象的具体细节,这样用户无需知道具体实现类到底是什么,但是需要知道用什么数字或是字符串能标识所要实现的类,类图如下? 其中 createITStaff() 需要传入参数
在这里插入图片描述

package SimpleFactory;

public class ITStaffFactory {

	public ITStaff createITStaff(String type){
		ITStaff itstaff = null;
		if(type.equals("ITManager")){
			itstaff = new ITManager();
		}else if(type.equals("Developer")){
			itstaff = new Developer();
		}else if(type.equals("Tester")){
			itstaff = new Tester();
		}
		return itstaff;
	}
}

它由三种角色组成:
1、工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
2、抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
3、具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

缺点

简单工厂表面上解决了用户需要了解具体实现类的问题,但实际上还需要用户传入的参数来决定具体的实现类,参数的可变性使用户容易输错,造成很大的影响。除此以外,当产品有复杂的多层级结构时,工厂类只有一个,这样每添加一个新产品,修改会变得非常复杂,不仅要决定新产品,还需要决定新产品下的子产品,最后会添加很多个if-else分支,使得逻辑过于复杂。

静态工厂模式

在这里插入图片描述

package staticFactory;

public class ITStaffFactory {
	public static ITStaff createITManager(){
		return new ITManager();
	}
	public static ITStaff createDeveloper(){
		return new Developer();
	}
	public static ITStaff createTester(){
		return new Tester();
	}
}

由于是静态方法,在client中无需创建工厂类的对象,可以直接调用工厂类创建对象的方法?,用户不需要传参,减小了传参错误的影响

case 1:
	staffList.add(ITStaffFactory.createITManager());
	break;
case 2:
	staffList.add(ITStaffFactory.createDeveloper());
	break;
case 3:
	staffList.add(ITStaffFactory.createTester());
	break;
缺点

简单工厂模式通常使用了静态工厂方法,这样做不必传入参数,不必创建工厂类的对象,但是这使得该工厂无法由子类继承,造成工厂角色无法形成基于继承的等级结构。

工厂方法

工厂方法模式是对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。?
在这里插入图片描述

它由四种角色组成:
1、抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
2、具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
3、抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
4、具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

优点

简单工厂模式的工厂类随着产品类的增加需要增加很多方法(或代码),而工厂方法模式每个具体工厂类只完成单一任务,代码简洁。工厂方法模式完全满足OCP,即它有非常良好的扩展性。

缺点

不易于维护,假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦。

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

还是以我的作业为例:有两个实体类 Staff 和 Computer,要求可以根据Client要求添加数据到 MySQL 或者 SqlServer 中。
最普通的做法(也是简单工厂模式)就是用户设定一个参数来指定选择数据库中的一种,但可能会出现用户不理解参数含义或是不小心打错参数的情况,从而引发不好的结果。抽象工厂呢,就能很好的解决这个问题,那抽象工厂模式具体是如何实现的呢?
请看下图:
抽象工厂模式 来自于作业的tutorial

其中Product对应实体类,代入题目,ProductA代表Staff,ProductB代表Computer,它们都只是接口,都由 n 个类实现,这里的 n 即为工厂的个数,在题目中为数据库的个数即2。
其中Factory类会调用使用到该工厂具体Product的方法,在这里有两个Product类就有两个方法,分别创建各自具体的对象。
最后在client中,用户可以先自定义像加工处理的工厂类是什么,然后再通过这个工厂类创建自己想要的对象,这样用户也无需传入参数了,调用的是直接的方法。

优点

抽象工厂模式主要在于应对新系列的需求变化。它将客户和类的实现分离,客户通过他们的抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中。
简单工厂
?简单工厂
抽象工厂
?抽象工厂
一个具体工厂类在一个应用中仅出现一次——即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。它有利于产品的一致性。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。抽象工厂模式有助于这样的团队的分工,降低了模块间的耦合性,提高了团队开发效率。

缺点

抽象工厂模式在于难于应付“新对象”的需求变动。难以支持新种类的产品。难以扩展抽象工厂以生产新种类的产品。这是因为抽象工厂几乎确定了可以被创建的产品集合,支持新种类的产品就需要扩展该工厂接口,这将涉及抽象工厂类及其所有子类的改变。

考虑一下增添数据库或实体类的情况,如果数据库选择范围增加了,那么需要新创建的文件就是Factory3,ProductA3,ProductB3;如果实体类增加了,那么需要新创建的文件就是ProductC接口,ProductC1,ProductC2,然后在Factory1和Factory2中再添加一个创建productC的方法即可。

参考资料:

  1. java 三种工厂模式优缺点解析 文末的例子也举得很好
  2. 深入理解java三种工厂模式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值