工厂模式
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。封装性好,通过简单工厂,实现了客户端和具体实现类的解耦。
分类
1)简单工厂模式(Simple Factory):不利于产生系列产品;
2)工厂方法模式(Factory Method):又称为多形性工厂;
3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品;
GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。
2)工厂方法模式(Factory Method):又称为多形性工厂;
3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品;
GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。
工厂方法模式(包含简单工厂模式)
简单工厂模式又称静态工厂方法模式。从命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化, 如同一个交通警察站在来往的车辆流中,决定放行那一个方向的车辆向那一个方向流动一样。
先来看看它的组成:
a) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。在java中由接口或者抽象类来实现。工厂类在客户端的直接控制下(Create,LightSimpleFactory方法)创建产品对象。
b) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。定义简单工厂创建的对象的父类或它们共同拥有的接口。可以是一个类、抽象类或接口。
c) 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。定义工厂具体加工出的对象。
优点:
工厂类可以决定创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。实现了对责任的分割。
缺点:
工厂类集中了所有产品创建逻辑,一旦工厂不能正常工作,整个系统都要受到影响。
系统扩展困难,一旦添加新产品就不得不修改工厂逻辑(生产线)。
先来看看它的组成:
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();
}
}