设计模式-工厂模式

在面向对象的编程中,我们常常会用到new这个关键字,同时,面向对象可以实现多态,这样的话,我们常常就会用父类或者接口定义一个变量,在用到这个变量的时候,再new一个具体的对象,但是有的时候,这个new的对象不是确定的,可能是要根据不同的场景,new出不同的子类,这个很简单的就可以通过if 或者switch来判断实现,但是,这样子以来的话,如果在很多个地方都出现了这种情况,岂不是都要在这些个地方来写这些一样的代码?这样真的好么?

工厂模式就是用来解决这种对象的生成的办法。工厂模式主要分为3种:简单工厂,工厂方法,抽象工厂。

简单工厂:

 简单工厂其实就是将对象的生成单独抽象出来成为一个单独的类,这样子就可以在生成对象的时候,直接调用这个类的create的方法来返回一个对象。有的时候,这个生成类的方法可以写成静态的,也就是所说的静态工厂.

  但是有的时候,这个类生成方法,对于不同的类,生成的过程是不一样的,比如A类,只需要1、2、3这3个类,B类只会生成4,5,6这3个类,如果用简单工厂的话,一是会显得很冗余,逻辑处理很烦,二是每多一个if的判定都会降低效率。我们就把对应的工厂方法放到了不同的类中

工厂方法:

  工厂方法就是不把具体的生成类的过程单独抽象成一个类,而是在A,B这两个父类中,定义一个抽象方法createXX(),然后在A,B这两个子类中针对自己实现createXX()方法。

抽象工厂:

抽象工厂可以针对一组对象的生成,比如A类B类都要有一个1 2 3 这3个类,这3个类是3种类别是一个父类,又分别分为几种,1类中有1a,1b,1c,2类3类中一样,我们的A对象需要的是1a,2b,3a,B对象需要的是1b,2a,3c,那么我们就定义个抽象的工厂类,分别分为create1(),create2(),creat3(),3个方法,然后继承过来两个工厂类,分别返回A,B类需要的工厂,我们在A类,B类的构造函数中注入这两个工厂实现类,就可以调用他们的create1,create2,create3的方法来获取自己想要的1,2,3这3种类了。

设计原则:

工厂模式中用到了一个设计原则,依赖倒置原则:

依赖倒置原则:依赖抽象,不要依赖具体类
其实我的感觉就是定义变量的时候定义父类,而不是具体子类,对象的构建就需要动态的生成,要完成依赖倒置,可以依据下面的方法:

变量不可以持有具体类的引用
不要让类派生自具体类
不要覆盖基类中已实现的方法