设计模式之工厂模式

  以前看过很多关于工厂模式的例子,当然能够看懂代码,但是为什么这样设计,这样设计的好处却不知道。最近在学习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();

}

posted @ 2016-02-19 15:57  流浪在寂寞古城  阅读(174)  评论(0编辑  收藏  举报