一.前言  

话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰)、Bmw(宝马)、Audi(奥迪)),还雇了司机为他开车。不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”。
你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的

幸运的是这种有病的现象在OO语言中可以避免了。下面以Java语言为基础来引入我们本文的主题:工厂模式!

 

二.简介

工厂模式主要是为创建对象提供了接口。工厂模式按照《Java与模式》中的提法分为三类:
1. 简单工厂模式(Simple Factory)
2. 工厂方法模式(Factory Method)
3. 抽象工厂模式(Abstract Factory)
这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。两者皆可,这本为使用《Java与模式》的分类方法。
在什么样的情况下我们应该记得使用工厂模式呢?大体有两点:
1.在编码时不能预见需要创建哪种类的实例。
2.系统不应依赖于产品类实例如何被创建、组合和表达的细节
工厂模式能给我们的OOD、OOP带来哪些好处呢??

三.简单工厂模式

这个模式本身很简单而且使用在业务较简单的情况下。一般用于小项目或者具体产品很少扩展的情况(这样工厂类才不用经常更改)。
它由三种角色组成:
工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,根据逻辑不同,产生具体的工厂产品。如例子中的Driver类。
抽象产品角色:它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。如例中的Car接口。
具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现,如例子中的Benz、Bmw类。

来用类图来清晰的表示下的它们之间的关系:

简单工厂模式、工厂模式和抽象工厂模式

下面就来给那个暴发户治病:在使用了简单工厂模式后,现在暴发户只需要坐在车里对司机说句:“开车”就可以了。来看看怎么用代码实现的:(为方便起见,所有的类放在一个文件中,故有一个类被声明为public)

简单工厂模式、工厂模式和抽象工厂模式
 1 //抽象产品  
 2 abstract class Car{  
 3     private String name;  
 4       
 5     public abstract void drive();  
 6       
 7     public String getName() {  
 8         return name;  
 9     }  
10     public void setName(String name) {  
11         this.name = name;  
12     }  
13 }  
14 //具体产品  
15 class Benz extends Car{  
16     public void drive(){  
17         System.out.println(this.getName()+"----go-----------------------");  
18     }  
19 }  
20   
21 class Bmw extends Car{  
22     public void drive(){  
23         System.out.println(this.getName()+"----go-----------------------");  
24     }  
25 }  
26   
27 //简单工厂  
28 class Driver{  
29     public static Car createCar(String car){  
30         Car c = null;  
31         if("Benz".equalsIgnoreCase(car))  
32             c = new Benz();  
33         else if("Bmw".equalsIgnoreCase(car))  
34             c = new Bmw();  
35         return c;  
36     }  
37 }  
38   
39 //老板  
40 public class BossSimplyFactory {  
41   
42     public static void main(String[] args) throws IOException {  
43         //老板告诉司机我今天坐奔驰  
44         Car car = Driver.createCar("benz");  
45         car.setName("benz");  
46          //司机开着奔驰出发  
47         car.drive();  
48     }  
简单工厂模式、工厂模式和抽象工厂模式

相关文章: