设计模式之工厂模式
以前看过很多关于工厂模式的例子,当然能够看懂代码,但是为什么这样设计,这样设计的好处却不知道。最近在学习Spring的时候慢慢意识到Spring这个框架就是设计模式的一个大集合(现在理解的可能不对,当然肯定还不深入),理解好设计模式框架相对就容易学的多了。
在Effective Java这本书中,书一开始就在讲对象的创建。工厂是什么呢?工厂是生产东西的地方,在java中东西就是对象,工厂就是生产对象的地方。所以说对象不是new出来的,而是工厂生产出来的(当然在工厂的内部还是需要new,只是不在我们的一般类中进行new)。这样的好处就是,当需要的类型变化时候你不需要修改当前类中的代码(可能有很多需要new这个对象的地方),只要修改工厂的生产过程就好了。这样能够降低程序的耦合性,当需求变化一点时候,代码不需要大量的修改,各个模块之间相对独立。
我们进入正题,工厂模式有两种:一般的工厂模式和抽象的工厂模式。
1、先看一般的工厂模式:一个人乘坐某种交通工具出行。看我们的类图:
每一个交通工具对应着一个工厂,想要乘坐某种交通工具出行,那么只能采用继承。这里有一个缺点,就是每个工厂只能生产一种交通工具,抽象工厂模式解决看了这个问题。
我们可以看一段简单的代码:
看Vehicle代码:
package com.worsun.尚学堂工厂模式; public interface Moveable { void run(); }
看Car的代码:
package com.worsun.尚学堂工厂模式; public class Car implements Moveable{ private static Car car = new Car(); public Car(){} public static Car getInstance(){ return car; } public void run(){ System.out.println("车冒着烟去东北!"); } }
Plane和Broom代码类似于Car的代码。
再看抽象工厂类的代码:
package com.worsun.尚学堂工厂模式; public abstract class VehicleFactory { public abstract Moveable create(); }
看Car的工厂类CarFactory的代码:
package com.worsun.尚学堂工厂模式; public class CarFactory extends VehicleFactory{ public Moveable create(){ return new Car(); } }
最后看一下调用者的代码:
package com.worsun.尚学堂工厂模式; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub //Car car = new Car(); VehicleFactory factory = new BroomFactory(); Moveable m = factory.create(); m.run(); } }
以上就是一般的工厂模式,理解起来还是不费劲的,但记住两个字:继承。
特点:每一个产品对应一个工厂,每一个工厂对应一个产品,也就是一一对应的关系。
2、我们再来看看抽象工厂模式。与一般的共产模式很是类似,但是区别的是一个工厂可以生产很多产品。这里要记住两个字:组合。
先来看看类图关系:
public class Client { public static void main(String[] args) { CarFactory factory = new LuxuryCarFactory(); Engine engine = factory.createEngine(); engine.run(); engine.start(); } } interface Engine { void start(); void run(); } interface Seat{ void seat(); } interface Tyre{ void revolve(); } class LuxuryEngine implements Engine{ @Override public void start() { System.out.println("高端发动机启动快!"); } @Override public void run() { System.out.println("高端发动机跑的快!"); } } class LowerEngine implements Engine{ @Override public void start() { System.out.println("低端发动机启动慢!"); } @Override public void run() { System.out.println("低端发动机跑的慢!"); } } class LuxurySeat implements Seat{ @Override public void seat() { System.out.println("高端座椅坐着舒服!"); } } class LowerSeat implements Seat{ @Override public void seat() { System.out.println("低端座椅坐着难受!"); } } class LuxuryTyre implements Tyre{ @Override public void revolve() { System.out.println("高端轮胎不磨损~!"); } } class LowerTyre implements Tyre{ @Override public void revolve() { System.out.println("低端轮胎磨损快!"); } } interface CarFactory{ public Engine createEngine(); public Seat createSeat(); public Tyre createTyre(); } class LuxuryCarFactory implements CarFactory{ @Override public Engine createEngine() { return new LuxuryEngine(); } @Override public Seat createSeat() { return new LuxurySeat(); } @Override public Tyre createTyre() { return new LuxuryTyre(); } } class LowerCarFactory implements CarFactory{ @Override public Engine createEngine() { return new LowerEngine(); } @Override public Seat createSeat() { return new LowerSeat(); } @Override public Tyre createTyre() { return new LowerTyre(); } }
这里有一个魔法工厂,有一个默认工厂。魔法工厂生产Broom、MigicStick、Mushroom,默认工厂生产Car、AK47、Apple。一个工厂生产多种物品(对象)。具体的代码就不在这里打印出来了,看网址自己下载(代码借用尚学堂视频的,他们写的很简单易懂,懒得自己写了):http://download.csdn.net/detail/worsun/9436800
3、工厂方法(静态工厂模式)
这个比较简单,就是根据传入不同的参数构建不同的对象。如下:
if(type == 1){
new object1();
}else{
new object2();
}