抽象工厂方法模式--不确定产品设计(创建型模式03)


注意: 抽象工厂模式 工厂方法模式不要混肴了,抽象工厂模式扩展性更强,工厂方法模式更具体一些。抽象工厂是工厂方法的升级版本。他们的却别在于工厂方法用的是一个接口的所有东西,而抽象工厂用的是多个接口的不同东西。


什么是抽象工厂模式?
为指定的对象提供接口,而不指定他们的具体类。
抽象工厂模式,意在抽象这个词上边,抽象工厂说明这个工厂出来的东西是不具体的。
举个例子:抽象工厂模式源于以前针对不同操作系统的图形化解决方案,如Android和os中控件TextView、Button等控件,虽然都有这个对象,但是实现语言不同,展示效果也不尽然。所以对于不同的操作系统构成一个System产品类,而其下共同都有的TextView、Button等控件又是一个产品类。一家公司要来生产跨平台的App的时候,是一对一从原型设计到产品出炉都实行一套方案呢?还是使用抽象来衍生各个系统的需求实现呢?答案当然是后者,如果操作系统不止这两种还有Windows Phone、blackberry等,如果都要一对一来实现,那岂不是要浪费很多人力物力?这也是刚开始学的依赖倒置原则的实现。

抽象工厂模式中的四类角色

  1. 抽象工厂角色(AbstractFactory)
  2. 具体工厂角色(ConcreteFactory)
  3. 抽象产品角色(AbstractProduct)
  4. 具体产品角色(ConcreteProduct)

抽象工厂方法模式的实现
汽车厂生产汽车,一种汽车配有轮胎和引擎的配件。

抽象总车厂类:ICarFactory

public interface ICarFactory{
   ITire createTire();//轮胎
   IEngine createEngine();//引擎
}

轮胎相关类:ITire

public interface ITire{
void tire();
}
public class NormalTire implements ITire{
 public void tire(){
   system.out.println("我是普通轮胎");
 }
}
public class SUVTire implements ITire{
   public void tire(){
       system.out.println("我是越野轮胎");
}
}

发动机相关类:IEngine

public interface IEngine{
  void engine();
}
public class NormalEngine imlements IEngine{
  public void engine(){
       system.out.println("我是国产引擎");
}
}
public class SUVEngine implements IEngine{
  public void engine(){
      system.out.println("我是进口引擎");
}
}

东风汽车生产:

public class DongFengFactory implements ICarFactory{
   public ITire createTire(){
    return new NormalTire();
   }
   public IEngine createEngine(){
    return new NormalEngine();
   }
}

进口汽车生产:

public class ImprotFactory implements ICarFactory{
    public ITire createTire(){
      return new SUVTire();
    }
    public IEngine createEngine(){
      return new SUVEngine();
    }
}

主类调用:

public static void main(String[] args){
  ICarFactory car = new ImportFactory();
   car.caeateTire().tire();
   car.createEngine().engine();
  system.out.println("----------------")
  ICarFactory mCar = new NormalFactory();
   mCar.caeateTire().tire();
   mCar.createEngine().engine();
}
//运行结果
我是越野轮胎
我是进口引擎
----------------
我是普通轮胎
我是国产引擎

抽象工厂模式的优点在于便于更改产品簇。产品簇就是同一类产品,比如上方的轮胎相关类。还有分离了接口和实现类,客户端无需知道需要实现的具体对象。生产汽车不需要知道轮胎和引擎的种类。切换产品时更加灵活。
但是如果我们需要增加新一类的车吉普车,那么就要增加对应轮胎和引擎类,如果车种类过多,岂不是要增加很多的类文件,引起总体文件非常多,另外要增加新产品就要修改抽象工厂,那么具体工厂也要做相应的修改,实际开发要衡量好这个问题。



结合例子说一下工厂方法和抽象工厂方法的区别吧:
抽象工厂方法管理的比较细,他对分工做了明确规划:比如汽车轮胎和引擎的分别对待,你要加新产品可以在我相应的配件列表里增加配件并规划产品类,而工厂方法则不管这些,我就管生产一种汽车,你要想再增加新产品了,你重新写接口,重新配置产品类,而且你要想换轮胎等配件了还真是件麻烦事。你设计的代码好比这个汽车厂造汽车,如果功能少也就是只管造东风汽车(轮胎、引擎等配件固定,一对一关系),就用工厂方法模式,如果你设计的类功能复杂,也就是汽车比较高级(轮胎,引擎等配件种类多,一对多关系),就用抽象工厂模式。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值