设计模式----工厂模式

我们平时出行可以选择的交通工具有汽车、飞机等,假如我们出去旅行,想要选择汽车作为交通工具,我们可以这么写:

1、我们定义一个汽车类(这里使用的是单例模式创建Car,单例模式下可以确保Car类只有一个实例,而且自行实例化,并向整个系统提供这个实例,其它类要生成Car类的实例,只需要调用Car类的getInstance()方法):
public class Car{

     private static Car car;

     private Car() {
     }

     public static Car getInstance() {
           if (car == null) {
                synchronized (Car.class) {
                     if (car == null) {
                           car = new Car();
                     }
                }
           }
           return car;
     }

     public void run() {
           System.out.println("choose car");
     }
}

2、然后定义一个Travel类,在里面生成Car实例
public class Travel{
     public static void main(String[] args) {
           Car car = Car.getInstance();
           car.run();
     }
}

通过上面的这种方法,我们可以选择Car作为我们出行的交通工具,如果此时我们不想使用Car作为出行工具,想乘坐飞机,那么我们此时就再定义一个Plane类,然后再在Travel类中进行相关的修改,具体操作如下:

1、定义一个Plane类
public class Plance{

     private static Plane plane;

     private Plane () {
     }

     public static Plane getInstance() {
           if (plane == null) {
                synchronized (Plane.class) {
                     if (plane == null) {
                           plane = new Plane();
                     }
                }
           }
           return plane;
     }

     public void run() {
           System.out.println("choose plane");
     }
}

2、修改Travel类
public class Travel{
     public static void main(String[] args) {
           Plane plane = Plane.getInstance();
           plane.run();
     }
}

这样编写代码,虽然在实现上没什么问题,但是每次切换到别的交通工具上面需要修改的部分太多,有没有方法让我们只需要进行部分修改,就能实现不同交通工具的切换呢?这时候,我们就可以使用到工厂模式
大体实现如下:
  1. 创建一个 Moveable接口用来定义一些汽车、飞机等都有的特性;
  2. 创建Car类和Plane类实现Moveable接口;
  3. 创建一个抽象交通工具工厂类 VehicleFactory,用来创建汽车和飞机等交通工具;
  4. 创建一个汽车工厂类 CarFactory 和飞机工厂类PlaneFactory,它们都继承自VehicleFactory ,分别用来创建汽车和飞机;

下面看具体的代码实现:

1、创建一个 Moveable接口
public interface Moveable {
     abstract void run();
}

2、创建Car类
public class Car implements Moveable{

     private static Car car = new Car();

     private Car(){}

     public static Car getInstance() {

           return car;
     }

     public void run() {
           System.out.println("Car run run run ....");
     }
}

3、创建Plane类
public class Plane implements Moveable {

     private static Plane plane;

     private Plane() {
     }

     public static Plane getInStance() {
           return plane;
     }

     @Override
     public void run() {
           System.out.println("plane fly lfy lfy....");
     }
}

4、创建VehicleFactory类
public abstract class VehicleFactory {
     abstract Moveable create();
}

5、创建CarFactory类
public class CarFactory extends VehicleFactory{
     public Moveable create() {
           return Car.getInstance();
     }
}
6、创建PlaneFactory类
public class PlaneFactory extends VehicleFactory {
     public Moveable create() {
           return Plane.getInStance();
     }
}

7、创建Travel类具体实现选择交通工具
public class Travel {
     public static void main(String[] args) {
           VehicleFactory factory = new PlaneFactory();
           Moveable m = factory.create();
           m.run();
     }
}

上面这种工厂模式的编写方法,当需要修改交通工具时,就只要修改VehicleFactory factory = new PlaneFactory(); 部分
当需要再添加一种交通工具比如Bus时,就只要添加一个Bus类实现Moveable接口,添加一个BusFactory类继承VehicleFactory类
这种工厂模式的编写方法,保证了代码的开放封装原则,但是当要创建的工厂种类越来越多时,就要编写越来越多的工厂类,不便于代码的维护
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值