Java Factory概念学习第三课(抽象factory)

Java Factory概念学习第三课(抽象factory)

系列物品生产

接上一篇交通工具的实例化的内容,现在考虑另一种情况,即Test不仅仅需要交通工具,还需要武器、食物等等。

那么先写另外两个类:

public class M416 {

  public void shoot() {
    System.out.println("开枪哒哒哒");
  }
}
public class Cookie {

  public void chew() {
    System.out.println("吧唧吧唧嚼一嚼");
  }
}

还有之前的Car类:

public class Car{
  
  public void run() {
    System.out.println("奔跑中。。。。");
  }
  
}

此时使用工厂:

public class DefaultFactory {
  Car createCar() {
    return new Car();
  }
  AK47 createAK47() {
    return new AK47();
  }
  Cookie createCookie() {
    return new Cookie();
  }
}

Test类来获取三样物品:

public class Test {

  public static void main(String[] args) {

    DefaultFactory df = new DefaultFactory();
    AK47 ak47 = df.createAK47();
    Car car = df.createCar();
    Cookie cookie = df.createCookie();
  }

}

现在考虑替换,假如Test想要实例化其他的物品,而不是汽车、M416、饼干,而是另外的一种,比如魔法世界的扫把、魔杖、果实,那么需要重新做一个工厂,并包含三个生产这些东西的方法。

public class MagicFactory {

  public Broom createBroom() {
    return new Broom();
  }
  public MagicStick createMagicStick() {
    return new MagicStick();
  }
  public MagicFruit createMagicFruit() {
    return new MagicFruit();
  }
}

三个实体类:

public class Broom {

  public void run() {
    System.out.println("扫把飞起来");
  }
}
public class MagicStick {

  public void shoot() {
    System.out.println("魔杖咻咻咻");
  }
}
public class MagicFruit {

  public void chew() {
    System.out.println("啊呜啊呜吃果子");
  }
}

但这时,Test里面的东西几乎全要换掉了:

public class Test {

  public static void main(String[] args) {

    //DefaultFactory df = new DefaultFactory();
    MagicFactory mf = new MagicFactory();
    //下面的全部内容都要换
    Car car = df.createCar();
    AK47 ak47 = df.createAK47();
    Cookie cookie = df.createCookie();
  }
}

全部换掉的话未免太麻烦,这时抽象工厂闪亮登场,我们不妨把这些Factory也抽象起来,编写一个父类:

public abstract class AbstractFactory {

  /**这里的三个方法分别生产需要的物品,
  *  但是由于不确定是哪种工厂,
  *  于是把生产的产品也抽象化为交通工具(Car,Broom)+武器(M416,MagicStick)+食物(Cookie,Fruit)
  *  对应的三个抽象类也会列出
  **/
  public abstract Vehicle createVehicle();
  public abstract Weapon createWeapon();
  public abstract Food createFood();
  
}

三个抽象类:

public abstract class Vehicle {

  public abstract void run();
}
public abstract class Weapon {

  public abstract void shoot();
}
public abstract class Food {

  public abstract void chew();
}

让工厂类分别继承自AbstractFactory类;

让Car和Broom类分别继承Vehicle类;

让M416和MagicStick类分别继承Weapon类;

让Cookie和Fruit类分别继承Food类;

此时的DefaultFactory:

public class DefaultFactory extends AbstractFactory{
  
  @Override
  public Vehicle createVehicle() {
    return new Car();
  }
  
  @Override
  public Weapon createWeapon() {
    return new M416();
  }
  
  @Override
  public Food createFood() {
    return new Cookie();
  }
}

此时的MagicFactory:

public class MagicFactory extends AbstractFactory{

  @Override
  public Vehicle createVehicle() {
    return new Broom();
  }
  
  @Override
  public Weapon createWeapon() {
    // TODO Auto-generated method stub
    return new MagicStick();
  }
  
  @Override
  public Food createFood() {
    // TODO Auto-generated method stub
    return new MagicFruit();
  }
}

这时再看Test类:

public class Test {

  public static void main(String[] args) {

    AbstractFactory af = new DefaultFactory();
    Vehicle vehicle = af.createVehicle();
    Weapon weapon = af.createWeapon();
    Food food = af.createFood();
  }

}

此刻要是想要替换为另外一批产品,即魔法工厂的产品

只需要把:AbstractFactory af = new DefaultFactory();

更换为:AbstractFactory af = new MagicFactory();

以上就是抽象工厂的概念。

上一篇:一般factory
下一篇:BeanFactory

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值