1.简单工厂(特例)
java实现代码
TV.java
package com.jsly.simple;
public interface TV {
//打开电视
public void turnOn();
//关闭电视
public void turnOff();
}
HaiErTV.java
package com.jsly.simple;
public class HaiErTV implements TV {
public void turnOff() {
System.out.println("HaiErTV.turnOff()");
}
public void turnOn() {
System.out.println("HaiErTV.turnOn()");
}
}
ChangHongTV.java
package com.jsly.simple;
public class ChangHongTV implements TV {
public void turnOff() {
System.out.println("ChangHongTV.turnOff()");
}
public void turnOn() {
System.out.println("ChangHongTV.turnOn()");
}
}
TVFactory.java
package com.jsly.simple;
public class TVFactory {
public static final String HaiEr = "海尔";
public static final String ChangHong = "长虹";
public static TV createTV(String name){
TV tv = null;
if(HaiEr.equals(name)){
//........
//........
//生产海尔电视的方法
tv = new HaiErTV();
}else if(ChangHong.equals(name)){
//........
//........
//生产长虹电视的方法
tv = new ChangHongTV();
}else{
throw new RuntimeException("无法生产!");
}
return tv;
}
}
Client.java
package com.jsly.simple;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
//TV tv = TVFactory.createTV(TVFactory.HaiEr); //TVFactory生产海尔TV
TV tv = TVFactory.createTV(TVFactory.ChangHong); //TVFactory生产长虹TV
tv.turnOn();
}
}
2.工厂方法
java实现代码
TV.java 、HaiErTV.java 、 ChangHongTV.java无须改变
TVFactory.java
package com.jsly.simple;
public interface TVFactory {
//生产电视抽象方法
public TV createTV();
}
TVFactoryForHaiEr.java
package com.jsly.simple;
public class TVFactoryForHaiEr implements TVFactory {
public TV createTV() {
//........
//........
//生产海尔电视的方法
return new HaiErTV();
}
}
TVFactoryForChangHong.java
package com.jsly.simple;
public class TVFactoryForChangHong implements TVFactory {
public TV createTV() {
//........
//........
//生产长虹电视的方法
return new ChangHongTV();
}
}
Client.java
package com.jsly.simple;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
//TVFactory factory = new TVFactoryForHaiEr(); //创建生产海尔TV的TVFactory
TVFactory factory = new TVFactoryForChangHong(); //创建生产长虹TV的TVFactory
TV tv = factory.createTV();
tv.turnOn();
}
}
如果要在第一种方式中要添加一个海信电视,则需要修改TVFactory,即生产电视的方法,会影响到其他;
如果要在第一种方式中要添加一个海信电视,则需要添加一个海信电视生产厂(TVFactoryForHaiXin)来实现TVFactory,不会影响到其他;
工厂方法的优点:支持OCP原则。
工厂方法的使用场景:单一系列产品创建。
扩展:Open-Closed Principle 软件设计中的“开-闭原则”
这个原则最早是由Bertrand Meyer提出,英文的原文是:Software entities should be open for extension,but closed for modification.意思是说,一个软件实体应当对扩展开放,对修改关闭.也就是说,我们在设计一个模块的时候,应当使这个模块可以在不被修改的前 提下被扩展,换句话说就是,应当可以在不必修改源代码的情况下改变这个模块的行为.
满足OCP的设计给系统带来两个无可比拟的优越性.
1.通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性.
2.已有的软件模块,特别是最重要的抽象层模块不能再修改,这就使变化中的软件系统有一定的稳定性和延续性.