Java Factory概念学习第二课 (一般factory)

Java Factory概念学习第二课 (一般factory)

任意定制交通工具

上篇说到了实例化的控制,即控制对象的实例化个数,单例和多例。接下来慢慢过渡到工厂的概念。

先来考虑一下新的需求:Test类不仅仅需要汽车,还需要火车、飞机甚至宇宙飞船,那么怎么来方便的添加呢?

这个好说,写一个新的类Train:


class Train(){  
  
  public void run(){  
    
     System.out.println("火车呜呜呜地跑"); 
    
  }  
}

之前的Car类:

public class Car{
    public void run(){
       System.out.println("汽车突突突地跑");
    }
}

Test类:

public class Test{
  
     public static void main(String[] args){

          Car car = new Car();
          car.run();     
          Train train = new Train();       
          train.run();

     }

}

这时候我们只考虑添加一种交通工具的情况,但假如要添加很多种呢?假如不止run()一个方法,还有addOil()等,假如要替换一中交通工具,那么就要把Car car = new Car();全改了,这样会很麻烦。

这里考虑多态,把run抽象为接口:

public interface Moveable{
   void run();
}

Car和Train分别实现Moveable接口:

public class Car implements Moveable{
    @Override
    public void run(){
      
       System.out.println("汽车突突突地跑");
      
    }
}
public class Train implements Moveable{
    @Override
    public void run(){
      
       System.out.println("火车呜呜呜地跑");
      
    }
}

这时Test实例化Car和Train:

public class Test{
  
     public static void main(String[] args){

          Moveable car = new Car();
          car.run();     
          Moveable train = new Train();       
          train.run();

     }

}

此时的结构,假如想要增加或修改交通工具,只需要增加一个类实现Moveable如:

public class Plane implements Moveable{
    @Override
    public void run(){
      
       System.out.println("飞机嗖嗖的飞");
      
    }
}

修改的话只需从Moveable car = new Car();到Moveable car = new Plane();

以上内容基本是java典型的多态的应用,接下来引入工厂。

生产过程

回想上一篇的内容,使用new方法来实例化对象必然不会经过权限检查、对象数量限制等过程。

此时我们对汽车或者火车的生产过程添加一个中间过程,即工厂:

public class CarFactory{
  public Car getCar(){
    return new Car();
  }
}

这时的Test想要实例化汽车:

public class Test{
  
     public static void main(String[] args){

          CarFactory cf = new CarFactory();
          Moveable car = cf.getCar();
          car.run(); 

     }
}

这就完成了汽车生产的限制,当然,CarFactory里面可以加入任何的限制。

但是,如果我要生产另一种交通工具该怎么办?我们首先要加入TrainFactory类:

public class TrainFactory{
  public Train getTrain(){
    return new Train();
  }
}

然后在Test里面修改:

public class Test{
  
     public static void main(String[] args){

          TrainFactory cf = new TrainFactory();
          Moveable car = cf.getTrain();
          car.run(); 

     }

}

这样很麻烦。于是我们参考上面的思路,不妨再次使用多态的方法,将get交通工具的方法抽象出来:

public abstract class VehicleFactory{
  public abstract Moveable getVehicle();
}

我们把这个VehicleFactory当做父类,让CarFactory和TrainFactory来继承并实现它的getVehicle()方法:

public class CarFactory extends VehicleFactory{
  
  @Override
  public Moveable getCar(){
    return new Car();
  }
}
public class TrainFactory extends VehicleFactory{
    
  @Override
  public Moveable getTrain(){
    return new Train();
  }
}

此时,Test里面的实现:

public class Test{
  
     public static void main(String[] args){

          VehicleFactory cf = new TrainFactory();
          Moveable tar = cf.getVehicle();
          tar.run(); 

     }

}

此时只需将VehicleFactory cf = new TrainFactory();替换为VehicleFactory cf = new CarFactory();

此时同理,要想加入其他交通工具如扫把broom,首先要加入类Broom:

public class Broom implements Moveable{
    @Override
    public void run(){
      
       System.out.println("扫把咻咻咻地飞");
      
    }
}

再加入BroomFactory:

public class BroomFactory extends VehicleFactory{
    
  @Override
  public Moveable getBroom(){
    return new Broom();
  }
}

之后的工作就在Test里面自由实现了。
一般的工厂概念就这些,下一篇说一下更深一层的抽象工厂概念。

上一篇:单例、多例
下一篇:抽象factory

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值