设计模式之工厂模式
一、小故事
话说十年前,有一个暴发户,他家有三辆汽车——Benz 奔驰、Bmw 宝马、Audi 奥迪,还雇了司机为他开车。不过,暴发户坐车时总是怪怪的:上 Benz 车后跟司机说“开奔驰车!”, 坐上 Bmw 后他说“开宝马车!”,坐上 Audi 说“开奥迪车!”。你一定说:这人有病!直接说 开车不就行了?!
二、分类
工厂模式主要是为创建对象提供过渡接口,将创建对象的具体过程屏蔽起来,以提高灵活性的目的。
分为三类:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
简单工厂模式的组成:
1)工厂类角色:模式的核心,含有一定的逻辑判断
2)抽象产品角色:一般是具体产品继承的父类或实现的接口
3)具体产品角色:工厂类所创建的对象
以简单工厂模式来改造暴发户坐车的方式 ——现在暴发户只需要坐在车里对司机说句:“开车”就可以了。
//抽象产品角色 public interface Car{
public void drive(); }
//具体产品角色
public class Benz implements Car{
public void drive() { System.out.println("Driving Benz ");
} }
public class Bmw implements Car{ public void drive() {
System.out.println("Driving Bmw "); }
} 。。(奥迪我就不写了:P)
//工厂类角色 public class Driver{
//工厂方法.注意 返回类型为抽象产品角色
public driverCar(String s)throws Exception {
//判断逻辑,返回具体的产品角色给 Client
if(s.equalsIgnoreCase("Benz"))
return new Benz();
else if(s.equalsIgnoreCase("Bmw"))
return new Bmw(); ......
else throw new Exception();
。。。 //欢迎暴发户出场......
public class Magnate{
public static void main(String[] args){
try{
//告诉司机我今天坐奔驰
Car car = Driver.driverCar("benz");
//下命令:开车
car.drive(); 。。。。
缺点:不符合程序的开闭原则(对扩展开放,对修改封闭),例如:每增加一辆车时,都要在工厂类中增加相应的业务逻辑和判断逻辑。
工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,是的它可以被子类继承,可以将简单工厂模式里集中在工厂方法上的压力分担到工厂方法模式中不同的工厂子类。
构成:
1)抽象工厂角色:具体工厂角色鼻血实现的接口或必须继承的父类。
2)具体工厂角色:含有具体业务逻辑的有关代码,由应用程序调用以创建具体的产品对象
3)抽象产品角色:具体产品集成的父类或实现的接口
4)具体产品角色:具体工厂角色创建的实例。
话说暴发户生意越做越大,自己的爱车也越来越多。这可苦了那位司机师傅了,什么车它都 要记得,维护,都要经过他来使用!于是暴发户同情他说:看你跟我这么多年的份上,以后 你不用这么辛苦了,我给你分配几个人手,你只管管好他们就行了!于是,工厂方法模式的管理出现了
//抽象产品角色,具体产品角色与简单工厂模式类似,只是变得复杂了些,这里略。 //抽象工厂角色
public interface Driver{
public Car driverCar(); }
public class BenzDriver implements Driver{ public Car driverCar(){
return new Benz(); }
}
public class BmwDriver implements Driver{
public Car driverCar() { return new Bmw();
} }
//应该和具体产品形成对应关系... //有请暴发户先生
public class Magnate
{
public static void main(String[] args)
{
try{
Driver driver = new BenzDriver();
Car car = driver.driverCar();
car.drive();
} ......
}