前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式:抽象工厂

设计模式:抽象工厂

作者头像
用户1172465
发布2018-01-08 14:26:33
6710
发布2018-01-08 14:26:33
举报
文章被收录于专栏:everhad

抽象工厂概念

将工厂定义为接口,它提供创建一系列相关对象的方法。

代码示例

接口Car、Ship是要得到的抽象产品类型,BigCar、BigShip、MiniCar、MiniShip是可能的不同具体的产品,有可能扩展。 ProductFactory定义了不同类型Car、Ship的获取方式。

代码语言:javascript
复制
interface Car {
  String getBrand();
}

interface Ship {
  String getBrand();
}

class BigCar implements Car {
   @Override
   public String getBrand() {
       return "Big";
   }
}

class BigShip implements Ship {
   @Override
   public String getBrand() {
       return "Big";
   }
}

class MiniCar implements Car {
   @Override
   public String getBrand() {
       return "Mini";
   }
}

class MiniShip implements Ship {
   @Override
   public String getBrand() {
       return "Mini";
   }
}

interface ProductFactory {
  Car makeCar();
  Ship makeShip();
}

ProductFactory的特点是,它是接口,定义了提供一系列相关的产品的获取。

之后提供不同的BigProductFactory和MiniProductFactory来实现工厂接口。以提供不同品牌的Car和Ship。

代码语言:javascript
复制
class BigFactory implements ProductFactory {

   @Override
   public Car makeCar() {
       return new BigCar();
   }

   @Override
   public Car makeShip() {
       return new BigShip();
   }
}

class MiniFactory implements ProductFactory {

   @Override
   public Car makeCar() {
       return new MiniCar();
   }

   @Override
   public Car makeShip() {
       return new MiniShip();
   }
}

对应客户端代码,获取Car、Ship时以某种方式获得具体的ProductFactory对象。 在需要提供不同品牌的产品时,使用不同的工厂类即可。

代码语言:javascript
复制
ProductFactory factory = new MiniProductFactory();

Car car = factory.makeCar();
Ship ship = factory.makeShip();

工厂类的提供

工厂类的获取是唯一可能改动客户端的地方,但对于使用抽象的Car、Ship的客户端代码来说,大多情况下工厂类的选择也应该抽象掉。 可以使用一个简单工厂模式来提供工厂:

代码语言:javascript
复制
class ProductFactoryProvider {
  public static ProductFactory getFactory() {
    // .. 读取配置,修改,反射等 ,根据环境,作出选择提供具体的工厂
    if (...) {
        return BigProductFactory();
    } 
    return MiniProductFactory();
  }
}

理解

抽象工厂一次性提供若干相关对象的创建,所以适合在不同环境下提供不同系列类型的场景。 比如DAO对象,可以为oracle和mysql数据库提供不同的工厂。 工厂类的获取也可以抽象化,比如反射得到。 客户端对具体的数据库类型和具体的工厂都不需要知道,所以替换不同数据库是无需改变调用者代码。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-01-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 抽象工厂概念
  • 代码示例
  • 工厂类的提供
  • 理解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档