在工厂方法模式中,父类负责定义建立对象的公共接口,而子类则负责生成具体的对象,这样作的目的是将类的实例化操做延迟到子类中完成,即由子类来决定究竟应该实例化(建立)哪个类。ide
工厂方法模式的UML类图spa
Product:产品角色对象
定义产品的接口。接口
ConcreteProduct:真实的产品ci
实现接口Product类。产品
Creator:工厂角色ast
声明工厂方法(FactoryMethod),返回一个产品。class
ConcreteCreator:真实的工厂扩展
实现FactoryMethod工厂方法,由客户调用,返回一个产品的实例。程序
Java实例——扩展了的手机工厂
手机接口:
public interface Mobile {
public void call();
}
手机工厂接口:
public interface MobileFactory {
public Mobile produceMobile();
}
摩托罗拉手机实现手机接口:
public class Motorola implements Mobile{
@Override
public void call() {
// TODO Auto-generated method stub
System.out.println("摩托罗拉手机");
}
}
诺基亚手机实现手机接口:
public class Nokia implements Mobile{
@Override
public void call() {
// TODO Auto-generated method stub
System.out.println("诺基亚手机");
}
}
摩托罗拉工厂实现了生产手机的方法,返回摩托罗拉手机:
public class MotorolaFactory implements MobileFactory{
@Override
public Mobile produceMobile() {
// TODO Auto-generated method stub
System.out.print("摩托罗拉工厂制造了");
return new Motorola();
}
}
诺基亚工厂实现了生产手机的方法,返回诺基亚手机:
public class NokiaFactory implements MobileFactory{
@Override
public Mobile produceMobile() {
// TODO Auto-generated method stub
System.out.print("诺基亚工厂制造了");
return new Nokia();
}
}
客户程序:
public class Client {
public static void main(String args[]){
MobileFactory mf;
Mobile m;
mf=new MotorolaFactory();
m=mf.produceMobile();
m.call();
mf=new NokiaFactory();
m=mf.produceMobile();
m.call();
}
}
输出结果:
摩托罗拉工厂制造了摩托罗拉手机
诺基亚工厂制造了诺基亚手机
应用情景:
1. 类不知道本身要建立哪个对象。
2. 类用它的子类来指定建立哪一个对象。
3. 客户须要清楚建立了哪个对象。