No.19  

 

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

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

工厂角色是工厂模式的核心,由它负责类的创建,这就是说所有的产品类的ProductA a=new ProductA()之类的语句都只出现在工厂角色中,由它决定创建哪个产品角色,由于每个具体产品角色都实现了同一个接口,因此创建哪个角色的问题可以放到工厂中解决,而不用在客户端解决。

抽象产品类,顾名思义,它是抽象的,或者是一个接口,由具体产品角色继承或实现它。

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

首先先确定角色:

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

posted on 2014-07-02 17:04  No.19  阅读(226)  评论(0)    收藏  举报