首页 > 代码库 > 设计模式之简单工厂模式

设计模式之简单工厂模式

 

简单工厂模式属于工厂模式的一种,工厂模式总共有三种,分别是简单工厂模式,工厂方法模式和抽象工厂模式,三者有一个共同点,就是对象的创建都交给了工厂去做。从简单工厂模式到抽象工厂模式,抽象级别逐渐升高。

工厂模式包括三个部分:工厂角色,抽象产品角色和具体产品角色。

工厂角色是工厂模式的核心,由它决定创建哪个产品角色,由于每个具体产品角色都实现了同一个接口,因此创建哪个角色的问题可以放到工厂中解决,而不用在客户端解决。

详细例子如下:选取网上常用到的例子,富翁,司机和三辆车(奔驰,宝马和奥迪)。在没用到设计模式之前,富翁坐上了奔驰车,要说“开奔驰车”,车才会开(个人觉得这个例子怪怪的,暂时就这么理解吧),然后我们来看看用了简单工厂模式会怎么样。

首先先确定角色:

1.抽象产品角色(要先有产品工厂才能生产)

1 public interface Car {2  public void drive();3 }

2.具体产品角色

1 public class Audi implements Car {2 3     @Override4     public void drive() {5         System.out.println("Drive Audi");6     }7 8 }
1 public class Benz implements Car {2 3     @Override4     public void drive() {5         System.out.println("Drive Benz");6     }7 8 }
1 public class BMW implements Car {2 3     @Override4     public void drive() {5         System.out.println("Drive BMW");6     }7 8 }

3.工厂角色

 1 public class Driver { 2     public static Car driveCar(String car){ 3         if(car.equalsIgnoreCase("Benz")) 4             return new Benz(); 5         if(car.equalsIgnoreCase("BMW")) 6             return new BMW(); 7         if(car.equalsIgnoreCase("Audi")) 8             return new Audi(); 9         else{10             System.out.println("车库中暂时没有这个车");11             return null;12         }13     }14 }

然后写一个客户端测试一下

1 public class TestDriver {2     @Test3     public void Magnate() throws Exception{4         Car car = Driver.driveCar("Benz");5         car.drive();6     }7 }

这里的代码有个小bug,就是在客户端输入一个不存在的车名是会出现异常,但是这并不妨碍我们了解简单工厂模式,所以无需计较。
可以看到,工厂角色是整个代码的核心。简单工厂模式的好处在于不需要把具体类直接暴露给客户端,另外,代码中的逻辑判断都在工厂角色中,所以客户端不需要负责太多功能。而缺点则在于违反了开闭原则。可以看到,如果富翁增加了一辆车,需要修改具体产品角色和工厂角色,在这样一个小例子看起来可能微不足道,但如果是在一个非常大的项目里面, 很有可能会牵一发而动全身。