设计模式-工厂模式

工厂模式

工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。封装性好,通过简单工厂,实现了客户端和具体实现类的解耦。

分类

1)简单工厂模式(Simple Factory):不利于产生系列产品;
2)工厂方法模式(Factory Method):又称为多形性工厂;
3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品;
GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。

工厂方法模式(包含简单工厂模式)

简单工厂模式又称静态工厂方法模式。从命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化, 如同一个交通警察站在来往的车辆流中,决定放行那一个方向的车辆向那一个方向流动一样。
 先来看看它的组成:
a) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。在java中由接口或者抽象类来实现。工厂类在客户端的直接控制下(Create,LightSimpleFactory方法)创建产品对象。
b) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。定义简单工厂创建的对象的父类或它们共同拥有的接口。可以是一个类、抽象类或接口。
c) 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。定义工厂具体加工出的对象。
优点:
工厂类可以决定创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。实现了对责任的分割。
缺点:
工厂类集中了所有产品创建逻辑,一旦工厂不能正常工作,整个系统都要受到影响。
系统扩展困难,一旦添加新产品就不得不修改工厂逻辑(生产线)。

工厂类角色:
public class LightSimpleFactory {
	 public Light create(String lightType){
	      if(lightType == "red")
	         return new RedLight();
	      else if(lightType == "green")
	         return new GreenLight();
	      else
	         return null;
	   }
}

抽象产品角色:
public interface Light {
	public abstract void turnOn();

	public abstract void turnOff();
}

具体产品角色:

public class RedLight implements Light {

	@Override
	public void turnOff() {
		System.out.println(" red light turn off");
	}

	@Override
	public void turnOn() {
		System.out.println(" red light turn on");
	}
	
}

public class GreenLight implements Light {

	@Override
	public void turnOff() {
		System.out.println(" green light turn off");
	}

	@Override
	public void turnOn() {
		System.out.println(" green light turn on");
	}

}

客户端:
public class Test {

	public static void main(String[] args) {
		LightSimpleFactory lightSimpleFactory= new LightSimpleFactory();
		Light redRight = lightSimpleFactory.create("red");
		redRight.turnOn();
		redRight.turnOff();
		Light greenRight = lightSimpleFactory.create("green");
		greenRight.turnOn();
		greenRight.turnOff();
//		print
//		 red light turn on
//		 red light turn off
//		 green light turn on
//		 green light turn off

	}
}

抽象工厂模式

a)抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
b)具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。
c)抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。
d)具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

抽象工厂
public interface ILightFactory {
	public Light creat();
}

具体工厂

public class RedLightFactory implements ILightFactory {
	@Override
	public Light creat() {
		return new RedLight();
	}
}

public class GreenLightFactory implements ILightFactory {
	@Override
	public Light creat() {
		return new GreenLight();
	}
}

抽象角色
public interface ILight {
	public abstract void turnOn();

	public abstract void turnOff();
}

具体角色
public class RedLight implements ILight {

	@Override
	public void turnOff() {
		System.out.println(" red light turn off");
	}

	@Override
	public void turnOn() {
		System.out.println(" red light turn on");
	}
	
}

public class GreenLight implements ILight {

	@Override
	public void turnOff() {
		System.out.println(" green light turn off");
	}

	@Override
	public void turnOn() {
		System.out.println(" green light turn on");
	}
}

客户端

public class Test {

	public static void main(String[] args) {
		ILightFactory redLightFactory= new RedLightFactory();
		RedLight redLight = (RedLight) redLightFactory.creat();
		redLight.turnOn();
		redLight.turnOff();

		ILightFactory greenLightFactory= new GreenLightFactory();
		GreenLight greenLight = (GreenLight) greenLightFactory.creat();
		greenLight.turnOn();
		greenLight.turnOff();
//		 red light turn on
//		 red light turn off
//		 green light turn on
//		 green light turn off

	}
}



public class RedLightFactory implements ILightFactory {
	@Override
	public Light creat() {
		return new RedLight();
	}
}

public class GreenLightFactory implements ILightFactory {
	@Override
	public Light creat() {
		return new GreenLight();
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章