码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之简单工厂模式

时间:2014-07-03 23:00:29      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   问题   代码   io   

 

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

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

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

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

首先先确定角色:

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

设计模式之简单工厂模式,布布扣,bubuko.com

设计模式之简单工厂模式

标签:style   blog   color   问题   代码   io   

原文地址:http://www.cnblogs.com/hoperxt/p/3820667.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!