在drp时运用到了工厂方法设计模式,通过简单的小例子,对其也有了更清楚的了解。之前对于工厂方法的理解,只是局限于定义,对于代码如何操作很难懂。这次在drp上老师一点点讲述关于简单工厂与工厂方法的使用时,才渐渐理清楚了思路。
工厂方法是将创建细节隐藏,从而使产品改变不会对客户造成影响。如下图:
电视接口
public interface TV {
public void turnOn();
public void turnOff();
}
具体电视类
public class ChangHongTV implements TV {
@Override
public void turnOn() {
System.out.println("ChangHongTV.turnOn()");
}
@Override
public void turnOff() {
System.out.println("ChangHongTV.turnOff()");
}
}
package com.bjpowernode.pattern;
public class HaiErTV implements TV {
@Override
public void turnOn() {
System.out.println("HaierTV.turnOn()");
}
@Override
public void turnOff() {
System.out.println("HaierTV.turnOff()");
}
}
public class HaiXinTV implements TV {
@Override
public void turnOn() {
System.out.println("HaiXinTV.turnOn()");
}
@Override
public void turnOff() {
System.out.println("HaiXinTV.turnOff()");
}
}
一般情况下,我们使用具体的电视,会通过接口取实例化具体电视,从而当我们在其他地方改变时造成改动,违背了OCP原则(开放封闭原则)。而这时候使用工厂的原因,在于,工厂可以实现隐藏电视的集体创建,将电视的具体创建交由工厂,当我们需要某种电视时,只需要交给某种电视的创建工厂去创建即可。下面是工厂类
工厂接口
//采用工厂将产品创建细节隐藏
//这样产品发生改变不会对客户造成影响
public interface TVFactory {
public TV createTV();
}
具体工厂类
public class TVFactoryChangHong implements TVFactory {
@Override
public TV createTV() {
//构造长虹的电视
//.....
//......
//......
return new ChangHongTV();
}
}
public class TVFacotryHaiXin implements TVFactory {
@Override
public TV createTV() {
//构造长虹的电视
//.....
//......
//......
return new HaiXinTV();
}
}
public class TVFactoryHaiEr implements TVFactory {
@Override
public TV createTV() {
//构造长虹的电视
//.....
//......
//......
return new HaiErTV();
}
}
这时候,在其它地方,我们使用时,就仅需要调用工厂去创建具体的电视工厂即可。例如:
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
//实例化创建海尔电视的工厂
TVFactory factory = new TVFactoryHaiEr();
TV tv = factory.createTV();
tv.turnOn();
//实例化创建长虹电视的工厂
factory = new TVFactoryChangHong();
tv = factory.createTV();
tv.turnOn();
//实例化创建海信电视的工厂
factory = new TVFacotryHaiXin();
tv = factory.createTV();
tv.turnOn();
}
}
当我们仍旧需要其他电视类型的时候,只需要田间一个相应的具体电视工厂类,以及一个具体的电视类即可,这样就实现了对修改封闭,对扩展开放。
但是工厂方法仍旧有不足,工厂方法只是针对单一系列产品实现开放原则,但是对于不同系列的产品仍旧违背这一原则,所以,有了后来的抽象工厂模式。请等下次分享!