上一篇,我们主要讲了Java设计模式的简单工厂模式
接下来就讲讲其工厂方法模式吧!
首先来复习一下,简单工厂模式的缺点之一:
1工厂类负责所有的产品实例,一旦工厂类出现问题,就会导致所有相关实例受到影响,就好比一群特务呆在一间房子里,一旦被发现,所有的特务就完蛋了
2第二个就是违背了开放-关闭原则,在工厂中添加新产品的时候,要更改其内部逻辑,同样在一间房子里,本来就有一些特务了,再来一些,就又要重新分配位置,至少要给个站的位置吧,
解决方式:
工厂方法模式和简单工厂模式的区别:
所以为了解决这些,我们可以将该工厂类像产品接口类和具体产品类一样,将其分为工厂接口类和具体工厂类,就好比是派一个人作为这些特务的接口人,当需要联络哪个特务的时候,只需要通过接口人,就可以找到对应的特务了,这样也保证了他们的安全。
话不多说,现在我们就来讲讲其具体实现步骤吧!
以下5个步骤就是该工厂模式的具体设计&实现流程
1创建抽象产品接口类,定义产品的公共接口
abstract class Product{
public abstract void name();
}
2创建具体产品类—继承抽象产品接口类,实现具体产品类
class Product1 extends Product{
public void name(){
System.out.println("我是第一个产品");
}
}
--------------------------------
class Product2 extends Product{
public void name(){
System.out.println("我是第二个产品");
}
}
3创建工厂接口类,定义抽象工厂接口
abstract class Factory{
//是要被产品类继承的,所以类型为Product
public abstract Product ShowName();
}
4创建具体工厂类----继承抽象工厂接口类,实现具体不同的工厂类
class Factory1 extends Factory{
public Product ShowName{
return new Prouduct1();
}
}
--------------------------------
class Factory2 extends Factory{
public Product ShowName{
return new Product2();
}
}
5外界通过调用工厂类的具体方法,从而创建不同的产品实例
package MS;
public class FactoryW {
public static void main(String args[]){
//生产第一个产品
Factory1 factory1=new Factory1();
factory1.ShowName().name();//先生成Product1的实例对象,然后再调用其name()方法
//生产第二个产品
Factory2 factory2=new Factory2();
factory2.ShowName().name();
}
}
----------------结果输出
我是第一个产品
我是第二个产品
以上就是该工厂方法模式的设计过程了
该方式的工厂和接口都采用抽象接口+继承实现类,
1更符合“开放-关闭”原则–类对外扩展,对修改关闭
当需要增加其他产品时,只需要继承抽象产品类接口,同时在工厂方面,继承抽象工厂类接口即可,不必对之前的产品类或工厂类进行修改
2符合单一职责原则
每一个产品具体类负责一个产品
每一个工厂具体类负责生产一个产品
3不使用静态方法,可以形成基于继承的等级结构
简单工厂模式的使用静态方法引入具体产品类
总结:工厂方法模式相对于简单工厂模式,其实就是将工厂类的实现方式变了,从之前的由静态方法引入产品类,到现在将工厂类分为抽象工厂类接口和具体工厂类,是其类扩展变得简单,同时也体现了多态性;
缺点:
1引入一个新的具体产品类时,需要重新建立一个对应的具体工厂类,在一定程度上,增加了系统的复杂性,且在编译的时候,也增加了系统的负担;
2一个具体工厂只能是生产一种具体产品
应用场景:
1当一个类只知道它所需要的对象的所属关系,而不知道它所需要的对象的具体类时:
在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道它所对应的工厂即可,通过调用对于的工厂类即可 生成出对应的产品
2当一个类希望通过它的子类来创建对象时:
在工厂方法模式中,是通过工厂子类自己创建对象,当对应的具体工厂类被调用之后,会返回具体产品类的实例对象,再通过该实例对象,实现对应的具体产品;
3将创建对象的任务委托给多个工厂子类中的某一个,无需关心哪个产品由哪个子工厂生厂,只需要动态调用对应的工厂子类即可