Java设计模式之工厂方法模式之特务角度

上一篇,我们主要讲了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将创建对象的任务委托给多个工厂子类中的某一个,无需关心哪个产品由哪个子工厂生厂,只需要动态调用对应的工厂子类即可

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值