java设计模式之工厂模式-个人学习历程

  • 本文主要是对工厂模式的进行介绍举例,同时根据一些资料进行相关总结,最后探究spirng ioc 对于工厂模式的应用。本文纯属个人学习记录,如有错误之处希望各位能够帮忙指正。。

1. 工厂模式介绍
  • 工厂模式由一个接口类加一个对应的工厂类实现的,接口类提供所有要创建出来的实体所需要的方法,创建对象时,使用该接口指向新创建的对象。工厂类只负责一件事:提供创建实体类的对象的方法。
  • 简单来说通过工厂类提供的方法帮助我们创建类实例对象,省去我们平时创建对象new的过程,从而达到减少对象调用方和实现类之间的耦合关系的目的。将创建的这个动作交由工厂,调用方不再和实现类产生关联。
例如业务里: 
Student student = new Student(); 
这个过程,直接与Student实现类产生关联。
 
现在仅需使用相应的引用接收对象实例即可:
Student student = beanFactory.create(params);
工厂类根据传入参数来判断具体创建哪种实体类

beanFacotry是我们的工厂类,create()方法就是创建对象的方法。

2.工厂模式的分类
  • 工厂模式分为三种,简单工厂模式工厂方法模式以及抽象工厂模式。下面会进行相关的介绍。

3.简单工厂模式
  • 当我们要创建的对象种类不多时,仅仅需要一个工厂类便能完成所有的创建工作,这种模式叫做简单工厂模式,在简单工厂模式中创建实例的方法通常为静态方法,因此又叫作静态工厂方法模式
  • 简单工厂模式包含三种角色:工厂角色抽象产品角色以及具体产品角色,下面是它们的介绍:
工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。

抽象产品(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

具体产品(Concrete Product)角色
是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

这里贴一张网上常见的结构图:
java设计模式之工厂模式-个人学习历程_第1张图片
其中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):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。

这里贴一张java设计模式之工厂模式-个人学习历程_第2张图片
其中concreteFacotry对应具体工厂角色,提供具体的对象创建方法。AbstactFactory接口对应抽象工厂角色,提供客户端调用的方法。其他角色和简单工厂模式角色一致。


  • 参考文献

https://zhuanlan.zhihu.com/p/...
https://www.jianshu.com/p/5cb...
http://c.biancheng.net/view/8...

未完待续。。。。

你可能感兴趣的:(java设计模式)