工厂方法模式(Factory Method):
Alias :virtual constructory 虚构造器
Intent: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
Motivation:一个框架使用抽象类定义和管理对象之间的关系。这个框架负责去创建这些对象。
工厂方法模式是类的创建模式,又叫做虚拟构造子模式(Virtual Constructor)或者多态性(Polymorphic Factory)工厂模式
工厂方法模式是简单工厂模式的进一步抽象和推广,其基本思想是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。
在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种具体细节。
工厂方法模式可用来允许系统再不修改具体工厂角色的情况下引进新的产品。
实际例子:
在射击游戏中,冲锋枪、狙击枪、手枪等不同武器(Weapon)的外观、使用方法和杀伤力都不相同,
玩家可以使用不同的武器,而且游戏升级时还可以增加新的武器,无需对现有系统做太多修改,如何设计武器系统?
实际设计的类:
Factory.java 类
public interface Factory {
public Weapon CreateWeapon();
}
//Weapon.java
public interface Weapon {
public void apperance();
public void killablility();
public void usage();
}
public class AWP implements Weapon {
public AWP() {
System.out.println("new AWP()");
}
public void apperance(){
System.out.println("new AWP() apperance()");
}
public void killablility(){
}
public void usage(){
};
}
public class HandGun implements Weapon {
public HandGun(){
System.out.println("new HandGun");
}
public void apperance(){
System.out.println("new HandGun() apperance()");
}
public void killablility(){
};
public void usage(){
};
}
public class SubmachineGun implements Weapon {
public SubmachineGun(){
System.out.println("new SubmachineGun()");
}
public void apperance(){
System.out.println("new SubmachineGun() apperance()");
};
public void killablility(){
};
public void usage(){
};
}
public class AWPFactory implements Factory {
public AWPFactory() {
super();
// TODO Auto-generated constructor stub
}
public Weapon CreateWeapon(){
System.out.println("CreateWeapon()");
return new AWP();
}
}
</pre><pre code_snippet_id="653785" snippet_file_name="blog_20150427_8_8831320" name="code" class="java">public class HandGunFactory implements Factory {
public HandGunFactory() {
super();
// TODO Auto-generated constructor stub
}
@Override
public Weapon CreateWeapon() {
// TODO Auto-generated method stub
System.out.println("create HandGun()");
return new HandGun();
}
}
public class SubmachineGunFactory implements Factory {
public SubmachineGunFactory() {
super();
// TODO Auto-generated constructor stub
}
public Weapon CreateWeapon(){
System.out.println("CreateWeapon()");
return new SubmachineGun();
}
}
public class Client {
public static void main(String[] arg){
AWPFactory aFactory=new AWPFactory();
AWP awp=(AWP) aFactory.CreateWeapon();
HandGunFactory hFactory=new HandGunFactory();
HandGun handGun=(HandGun) hFactory.CreateWeapon();
SubmachineGunFactory sFactory=new SubmachineGunFactory();
SubmachineGun submachineGun=(SubmachineGun) sFactory.CreateWeapon();
}
}
工厂方法模式涉及到抽象工厂角色(Creator)、具体工厂角色(Concrete Creator)、抽象产品(Product)角色及具体产品(Concrete Product)等四个角色,大体结构如下:
在以下情况下可以使用工厂方法模式:
1、一个类不知道它所需要的对象的类:在工厂方法模式中,客户端不需要知道具体产品的类名,只需要知道对应的工厂即可,具体的产品对象有具体的工厂类创建;客户端只需要知道创建具体产品的工厂类。
2、一个类通过其子类来指定创建那个对象:在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏替换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。
3、将创建对象的任务委托给多个工厂子类的某一个。客户端在使用时可以无需关系是哪一个工厂子类创建产品子类,需要时在动态指定,可将具体工厂类的类名存储在配置文件或数据库中。
源码包和UML图下载: