我们学习工厂方法,我们看一下工厂方法的定义,定义一个创建对象的接口,注意创建对象的接口,但是让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例推迟到子类中进行,回想一下简单工厂,类型也是创建型,创建对象往往需要非常复杂的过程,那创建对象也可能会导致大量的重复代码,工厂模式通过单独的一个方法,来解决这些问题,有子类来实现这个方法,这个也非常好记,这个模式两个简单的词语,创建工厂,创建对象用的,通过子类实现方法创建对象,那我们接着来看一下 我们接着来看工厂方法应用的场景,首先创建对象需要大量重复的代码,这个时候就可以考虑工厂方法适不适合在这里,客户端不依赖于产品类实例如何被创建,实现等细节,也就是说我们应用层的代码,不依赖于这产品实例如何被实现的,那一个类通过其子类来指定创建哪个对象,同样的工厂方法呢,在这个模式中,不需要具体类的类名,你只需要工厂就可以,具体的对象都由具体的工厂来创建的,客户端只需要我的产品是在哪个工厂里,那在这种模式当中,利用面向对象的多态性,和里氏替换原则,所以我们用这个模式,写的程序,在运行的时候,子类对象将覆盖父类对象,从而使系统更容易扩展,同时注意一下,我们的定义中也说了,工厂方法让类的实例化推迟到子类中进行,那可以回想一下简单工厂,类型也是创建型把创建对象的过程呢,推迟到子类来实现,所以创建对象的任务就委托给多个工厂子类中的某一个,客户端在使用时,无须关心是哪一个子类创建,需要的时候呢,如果需要动态指定,我们还可以把工厂类名配置到配置文件上,数据库中动态创建 我们继续来看工厂方法的优点,用户只需关心所需产品对应的工厂,无须关心创建细节,加入新的产品是符合开闭原则的,提高可扩展性,那我们来解读一下,在工厂方法模式中,我们用它来创建所需要的产品,同时又隐藏了实例化的细节,我们只需要关心产品所需要的工厂,无须关心创建细节,那对于工厂角色和产品角色,这方面的多态性设计,他可以使工厂自主,确定创建何种对象,而如何创建这个对象的细节,则完全封装在具体的工厂内部 那我们继续来看一下,工厂方法也是有缺点的,类的个数容易过多,增加复杂度,同时增加了系统的抽象性和理解难度,那设计模式也是一样,根据我们实际的应用场景,业务模型,来考虑,也不能过分的遵守设计原则和使用设计模式,这里面都是一个平衡,那类的个数容易过多怎么理解呢,后续coding也会领着大家来看,这里面先简单说一下,那我们在添加新产品的时候,我们要编写新的产品类,而且要对应具体的工厂类,所以类的个数会增加,那类的个数增加,系统的复杂度也就增加了,工厂方法本身也是利用了抽象,所以这里我们会引入动态层,可能还会增加反射这些技术,也增加系统的实现难度,这个肯定是小case,我们接下来一起coding,然后学习工厂方法这个模式演进的UML,然后一起来解析一些源码