简单工厂模式属于工厂模式的一种,工厂模式总共有三种,分别是简单工厂模式,工厂方法模式和抽象工厂模式,三者有一个共同点,就是对象的创建都交给了工厂去做。从简单工厂模式到抽象工厂模式,抽象级别逐渐升高。
工厂模式包括三个部分:工厂角色,抽象产品角色和具体产品角色。
工厂角色是工厂模式的核心,由它决定创建哪个产品角色,由于每个具体产品角色都实现了同一个接口,因此创建哪个角色的问题可以放到工厂中解决,而不用在客户端解决。
详细例子如下:选取网上常用到的例子,富翁,司机和三辆车(奔驰,宝马和奥迪)。在没用到设计模式之前,富翁坐上了奔驰车,要说“开奔驰车”,车才会开(个人觉得这个例子怪怪的,暂时就这么理解吧),然后我们来看看用了简单工厂模式会怎么样。
首先先确定角色:
1.抽象产品角色(要先有产品工厂才能生产)
1 public interface Car { 2 public void drive(); 3 }
2.具体产品角色
1 public class Audi implements Car { 2 3 @Override 4 public void drive() { 5 System.out.println("Drive Audi"); 6 } 7 8 }
1 public class Benz implements Car { 2 3 @Override 4 public void drive() { 5 System.out.println("Drive Benz"); 6 } 7 8 }
1 public class BMW implements Car { 2 3 @Override 4 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 @Test 3 public void Magnate() throws Exception{ 4 Car car = Driver.driveCar("Benz"); 5 car.drive(); 6 } 7 }
这里的代码有个小bug,就是在客户端输入一个不存在的车名是会出现异常,但是这并不妨碍我们了解简单工厂模式,所以无需计较。
可以看到,工厂角色是整个代码的核心。简单工厂模式的好处在于不需要把具体类直接暴露给客户端,另外,代码中的逻辑判断都在工厂角色中,所以客户端不需要负责太多功能。而缺点则在于违反了开闭原则。可以看到,如果富翁增加了一辆车,需要修改具体产品角色和工厂角色,在这样一个小例子看起来可能微不足道,但如果是在一个非常大的项目里面, 很有可能会牵一发而动全身。
原文:http://www.cnblogs.com/hoperxt/p/3820667.html