设计模式之简单工厂模式
简单工厂模式是最简单的工厂模式,又叫静态工厂方法模式。它实现了同一接口的一些类进行实例的创建,一个工厂通过条件语句创建多个产品,产品的创建逻辑集中在一个工厂类中,客户听过传递不同的参数给工厂,实现创建不同产品的目的。如下:
Phone是一个接口,其有一个行为是ring, NokiaPhone和EricssonPhone分别实现了这个接口,在客户端使用时通过传入的是什么手机类型,而得到不同的手机。实现如下:
Phone.java:
package org.designpattern.creational.simplefactory;
public interface Phone {
public void ring();
}
public void ring();
}
NokaiPhone.java
package org.designpattern.creational.simplefactory;
public class NokiaPhone implements Phone {
@Override
public void ring() {
// TODO Auto-generated method stub
System.out.println("nokia phone ring!");
}
}
public class NokiaPhone implements Phone {
@Override
public void ring() {
// TODO Auto-generated method stub
System.out.println("nokia phone ring!");
}
}
EricssonPhone.java
package org.designpattern.creational.simplefactory;
public class EricssonPhone implements Phone {
@Override
public void ring() {
// TODO Auto-generated method stub
System.out.println("ericsson phone ring!");
}
}
public class EricssonPhone implements Phone {
@Override
public void ring() {
// TODO Auto-generated method stub
System.out.println("ericsson phone ring!");
}
}
PhoneFactory.java
package org.designpattern.creational.simplefactory;
public class PhoneFactory {
public Phone producePhone(String phoneType){
if("nokia".equals(phoneType))
return new NokiaPhone();
else if("ericsson".equals(phoneType))
return new EricssonPhone();
else return null;
}
public class PhoneFactory {
public Phone producePhone(String phoneType){
if("nokia".equals(phoneType))
return new NokiaPhone();
else if("ericsson".equals(phoneType))
return new EricssonPhone();
else return null;
}
}
如果将PhoneFactory的写成两个静态的方法public static Phone produceNokiaPhone(),public static Phone produceEricssionPhone(),这种创建方法我们称之为静态工厂模式,其实我们使用较多的还是静态工厂模式。
使用时的客户端类:
package org.designpattern.creational.simplefactory;
public class Main {
public static void main(String[] args){
NokiaPhone nokia = (NokiaPhone) new PhoneFactory().producePhone("nokia");
nokia.ring();
}
public class Main {
public static void main(String[] args){
NokiaPhone nokia = (NokiaPhone) new PhoneFactory().producePhone("nokia");
nokia.ring();
}
}
可见这个工厂类集中了所有的产品的创建逻辑,形成了一个无所不知的全能类,显然如果这个类不能工作了,则整个程序就会受到影响。更主要是这样不利于扩展,如果应用中需要的工厂类型较多,势必造成工厂类型的职责雷同,因此我们需要更进一步的抽象了,于是就出现了工厂方法和抽象工厂模式。