- 本文次要是对工厂模式的进行介绍举例,同时依据一些材料进行相干总结,最初探索 spirng ioc 对于工厂模式的利用。本文纯属集体学习记录,如有谬误之处心愿各位可能帮忙斧正。。
1. 工厂模式介绍
- 工厂模式由一个接口类加一个对应的工厂类实现的,接口类提供所有要创立进去的实体所须要的办法,创建对象时,应用该接口指向新创建的对象。工厂类只负责一件事:提供创立实体类的对象的办法。
- 简略来说通过工厂类提供的办法帮忙咱们创立类实例对象,省去咱们平时创建对象 new 的过程,从而达到缩小对象调用方和实现类之间的耦合关系的目标。将创立的这个动作交由工厂,调用方不再和实现类产生关联。
例如业务里:Student student = new Student();
这个过程,间接与 Student 实现类产生关联。当初仅需应用相应的援用接管对象实例即可:Student student = beanFactory.create(params);
工厂类依据传入参数来判断具体创立哪种实体类
beanFacotry 是咱们的工厂类,create()办法就是创建对象的办法。
2. 工厂模式的分类
- 工厂模式分为三种,简略工厂模式 , 工厂办法模式 以及 形象工厂模式。上面会进行相干的介绍。
3. 简略工厂模式
- 当咱们要创立的对象品种不多时,仅仅须要一个工厂类便能实现所有的创立工作,这种模式叫做 简略工厂模式 ,在简略工厂模式中创立实例的办法通常为静态方法,因而又叫作 动态工厂办法模式。
- 简略工厂模式蕴含三种角色:工厂角色 , 形象产品角色 以及 具体产品角色,上面是它们的介绍:
工厂(Creator)角色
简略工厂模式的外围,它负责实现创立所有实例的外部逻辑。工厂类的创立产品类的办法能够被外界间接调用,创立所需的产品对象。形象产品(Product)角色
简略工厂模式所创立的所有对象的父类,它负责形容所有实例所共有的公共接口。具体产品(Concrete Product)角色
是简略工厂模式的创立指标,所有创立的对象都是充当这个角色的某个具体类的实例。
这里贴一张网上常见的结构图:
其中 product 对应形象产品角色,ConcreteProduct- X 对应具体产品角色,而 Factory 就是咱们的工厂角色。
- 上面通过代码示例来展现着三种角色的实现以及对象的产生过程:
- 形象产品角色
// 形象产品类(形象产品角色)
interface Student {void disPlay();
}
- 具体产品角色
// 班长具体实现类(具体产品角色 1)class Monitor implements Student {
@Override
public void disPlay() {System.out.println("我是班长!");
}
}
// 一般学生具体实现类(具体产品角色 2)class Ordinary implements Student {
@Override
public void disPlay() {System.out.println("我是一般学生!");
}
}
- 工厂角色
// 工厂类(工厂角色)class StudentFactory {
// 学生对象创立静态方法
public static Student create(String params) {
// 通过接口援用接管实现类的实例对象
Student student = null;
switch (params) {
case "ordinary":
student = new Ordinary();
break;
case "monitor":
student = new Monitor();
break;
}
return student;
}
}
- 调用方
public class FactoryTest {
// 业务办法
public static void main(String[] args) {
// 业务中仅需传入约定好的参数,便可间接获取绝对应的对象实例
Student ordinary = StudentFactory.create("ordinary");
ordinary.disPlay();
Student monitor = StudentFactory.create("monitor");
monitor.disPlay();}
}
- 执行后果
- 简略工厂模式的优缺点:
长处:客户端不与实现类间接关联,仅进行生产产品(调用对象办法),升高调用方与实现类之间的耦合性。引入配置文件,能够在不批改客户端代码的状况下引入新的产品类,进步零碎的灵活性。(这里我的了解是 --> 例如:monitor = "com.xxx.xxx.Monitor", 获取配置文件的 key(monitor),value(com.xxx.xxx.Monitor),当咱们须要获取某一类的对象时,通过传入的 params(也就是配置文件的 key),
查问到 value, 通过反射进行对象实例化,获取咱们想要的对象)----- 有一点疑难,不批改客户端代码,难道不批改 params 吗,what? 感觉只是不必批改工厂类。间接依据对应类相干的参数间接获取对象实例,通过参数代替长类名。
毛病:实例化对象的逻辑封装在一个工厂类中,一旦工厂类出了问题,将导致所有的产品类无奈实例化(一个人干多集体的活,这个人销假了多个活没人干了)。应用简略工厂模式会减少零碎中类的个数(引入新的工厂类),减少零碎的复杂度和了解难度(工厂类太多,调过去调过来整昏了。。)。零碎扩大麻烦,减少新产品时需批改工厂逻辑,违反了开闭准则(每次增加新产品都须要去减少传参 params 的判断逻辑)。简略工厂模式应用了 static 工厂办法,造成工厂角色无奈造成基于继承的等级构造。
实用场景:业务产品类绝对较少的状况。
3. 工厂办法模式
- 工厂办法模式 是对简略工厂模式的进一步抽象化,其益处是能够使零碎在不批改原来代码的状况下引进新的产品,即满足开闭准则。
- 简略的说就是为每个实现类都创立了一个具体工厂,由具体工厂来进行对象实例的创立(从多个对象由一个工厂创立变为了多个对象由各自对应的具体工厂创立,这样咱们须要增加新产品时,只需增加新的具体工厂,而不必批改原来的工厂类,合乎只扩大不批改的开闭准则)
工厂办法和简略工厂角色略有不同,简略工厂的工厂角色分化为形象工厂和具体工厂两个角色:
形象工厂(Abstract Factory):提供了创立产品的接口,调用者通过它拜访具体工厂的工厂办法 create() 来创立产品。具体工厂(ConcreteFactory):次要是实现形象工厂中的形象办法,实现具体产品的创立。
这里贴一张
其中 concreteFacotry 对应具体工厂角色,提供具体的对象创立办法。AbstactFactory 接口对应形象工厂角色,提供客户端调用的办法。其余角色和简略工厂模式角色统一。
- 参考文献
https://zhuanlan.zhihu.com/p/…
https://www.jianshu.com/p/5cb…
http://c.biancheng.net/view/8…
未完待续。。。。