引入工厂模式:
以前我们写的小物流的mvc模式都是直接new一个实现类对象,再调用他们的方法,可是这是耦合度高的,如果一个类是名字改了,每个程序的实现类名都要改,这是十分费时间的,我们其实要用的只是这个类里面的方法,不关心这个类名叫什么名字,所以我们引入了工厂模式,我们要的对象不用再去找类的,有工厂。工厂生产对象,我们只需要去找工厂拿这个对象就行了,每调用一次工厂,工厂都会给我们一个对象,此时就可以调用这个方法了。
public static 类名 getInstance(){
return new 类名();
如上,一个类里面有定义好了的方法,调用这个方法的时候回,给我们返回一个匿名对象,只能用一次,这个对象可以使用这个类的方法,工厂模式减少了我们的耦合度。
三种工厂模式:简单工厂(静态工厂),工厂方法,抽象工厂。
1.静态工厂模式
静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。将对象的创建过程进行了封装,用户不需要知道具体的创建过程,只需要调用工厂类获取对象即可。因此达到了解耦的目的。
以汽车为例子:工厂类(具体类)----抽象产品(抽象类或者接口)----具体产品(工厂生产的产品)
·工厂类:定义一个具体实现的类(工厂),有生产多个汽车的方法。
想要不同的汽车开车方式就生产不同的汽车。
·抽象产品:定义一个接口或者抽象类(汽车都有drive方法)
·具体产品:具体的,不同的汽车实现或者继承。由于开车的方式不一样,覆写方法,定义自己开车方式。
我们想要汽车就去找工厂,输入不同的汽车,工厂就生产不同的汽车。直接找的是工厂,以后汽车的开车方式变了,只需要改变这个汽车就行,工厂生产的还是汽车。就是new子类的工作变成的new工厂,中间加了一个中介。
工厂模式遗留的问题:对于功能的扩展不是很友好,每增加一辆新的汽车,就要在工厂类中增加相应的业务逻辑,违背了开闭原则。工厂类显得很被动,因此才有了工厂方法模式。
|开闭原则(Open-Closed Principle,OCP):一个软件实体应当对扩展开放,对修改关闭。即软码的情况下进行扩展。
2.工厂方法模式---把简单工厂的工厂类分为抽象工厂类和具体工厂类
工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。
·抽象工厂:接口或者实现类,是具体的工厂角色必须实现或者继承的类
·具体工厂:由程序调用去创建对应的具体产品的类。必须实现或者继承抽象工厂。
·抽象产品:具体产品继承的父类者实现的接口。
·具体产品:实现抽象产品,覆写方法,有自己的特性的类,由具体工厂生产出来。
当有新的汽车产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代码。可以看出工厂角色的结构也是符合开闭原则的!可以看出:简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂。这个工厂只需要继承或者实现抽象工厂,然后再生产自己的这个产品。
3.抽象工厂
在抽象工厂模式结构图中包含如下几个角色:
·AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
·ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
·AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
·ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法
工厂方法模式:
①一个抽象产品类,可以派生出多个具体产品类。
②一个抽象工厂类,可以派生出多个具体工厂类。
③每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
①多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
②一个抽象工厂类,可以派生出多个具体工厂类。
③每个具体工厂类可以创建多个具体产品类的实例。
区别:
①工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
②工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
和工厂方法模式有什么不同?
在工厂方法模式中,工厂子类负责抽象子类的实例化,每个工厂子类对应着一个抽象子类,且具有唯一性。而在抽象工厂模式中,一个工厂子类代表一个系列,工厂子类根据当前系列对不同类型的抽象子类进行创建。工厂方法模式中工厂子类对应的是一个类型的抽象子类,抽象工厂模式对应的是一个系列的抽象子类。
工厂方法模式一个工厂子类对应一个抽象子类的设计,会有很大的浪费,产生了过多的类。而抽象工厂模式更好的利用了工厂子类,使每个工厂子类对应着一个系列的抽象子类,这种设计非常适用于两个具有相同结构关系,但是分属于不同系列的系列之间的切换。
总之就是,工厂方法模式是针对单个类型的抽象类,而抽象工厂模式是针对具有相同结构的一系列类型的抽象类。