创建型模式-工厂方法模式
工厂方法模式
工厂方法模式是将对象的创建交给具体的工厂类,由具体的工厂类负责创建对应的对象。
在工厂方法模式中,定义一个抽象的工厂接口和一个抽象的产品接口,具体的工厂类实现工厂接口并创建对应的产品实例,而客户端通过工厂接口来获取需要的产品实例,从而将客户端和具体的产品实现分离开来。
举个例子:
现在需要创建一些角色,如鲁班七号、东皇太一等,这些角色都有三个技能,然后用工厂方法模式创建角色如下:
- 抽象工厂:AbstractRoleFactory
- 具体的工厂类:RoleFactory
- 抽象产品接口:Role
- 具体的产品实现:DongHuangTaiYiRole、LuBanQiHaoRole
抽象工厂-AbstractRoleFactory
public abstract class AbstractRoleFactory {
public abstract <T extends Role> T createRole(Class<T> tClass);
}
具体的工厂类-RoleFactory
public class RoleFactory extends AbstractRoleFactory {
@Override
public <T extends Role> T createRole(Class<T> tClass) {
Role role = null;
try {
role = (T)Class.forName(tClass.getName()).newInstance();
} catch (Exception e) {
System.out.println("创建角色失败");
}
return (T)role;
}
}
抽象产品接口-Role
public abstract class Role {
/**
* 技能1
*/
abstract void skill1();
abstract void skill2();
abstract void skill3();
}
具体的产品实现
东皇:
public class DongHuangTaiYiRole extends Role {
@Override
void skill1() {
System.out.println("技能1:日蚀祭典");
}
@Override
void skill2() {
System.out.println("技能2:曜龙烛兆");
}
@Override
void skill3() {
System.out.println("技能3:堕神契约");
}
}
鲁班:
public class LuBanQiHaoRole extends Role {
@Override
void skill1() {
System.out.println("技能1:河豚雷");
}
@Override
void skill2() {
System.out.println("技能2:无敌鲨嘴炮");
}
@Override
void skill3() {
System.out.println("技能3:空中支援");
}
}
使用
public class TestMain {
public static void main(String[] args) {
AbstractRoleFactory factory = new RoleFactory();
Role role = factory.createRole(DongHuangTaiYiRole.class);
role.skill1();
role.skill2();
role.skill3();
}
}
抽象工厂模式优点:
- 良好的扩展性,如果要添加新的角色,只需要实现Role接口创建实现类
- 良好的封装性,不需要知道具体角色的创建,只需要说明想要的角色即可。
使用前需要考虑是否需要增加一个工厂类进行管理,增加代码的复杂度。
需要灵活、可扩展的框架时可以考虑采用工厂方法模式