工厂方法模式
定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其他子类。
通用类图
通用代码
- 抽象产品类
public abstract Product {
public void method() {} // 抽象产品的公有方法
public abstract method2();
}
- 具体产品类
public ConcreteProduct1 extends Product {
public abstract method2() {
// 具体逻辑
}
}
public ConcreteProduct2 extends Product {
public abstract method2() {
// 具体逻辑
}
}
- 抽象工厂类
public abstract class Creator {
public abstract <T extends Product> T createProduct(Class<?> c);
}
- 具体工厂类
public class ConcreteCreator extends Creator {
public abstract <T extends Product> T createProduct(Class<?> c) {
Product product = null;
try {
product = (Product)Class.forName(c.getInstance()).newInstance();
} catch(Expection e) {
// 异常处理
}
return (T)product;
}
}
- 使用
public static void main(String[] args) {
Creator creator = new ConcreteCreator();
Product product = creator.createProduct(ConcreteProduct1.class);
}
样例展示
现在召唤师峡谷需要一批英雄,有法师、战士、刺客什么的,那么我们就可以这样使用工厂方法模式。
先定义一个抽象的英雄:
public abstract class Hero {
public abstract void attack();
}
要创造英雄总得创造设备吧,所以定义一个工厂:
public abstract class Creator {
public abstract <T extends Hero> T createHero(Class<?> c);
}
接下来是创造出具体的东西:
// 具体工厂
public class HeroCreator extends Creator {
@Override
public <T extends Hero> T createHero(Class<?> c) {
Hero hero = null;
try {
hero = (Hero) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T)hero;
}
}
// 具体英雄
public class Mage extends Hero { // 法师
@Override
public void attack() {
System.out.println("法术伤害");
}
}
public class Shooter extends Hero { // 射手
@Override
public void attack() {
System.out.println("物理攻击");
}
}
最后是客户端调用
public class Client {
public static void main(String[] args) {
Creator creator = new HeroCreator();
Hero hero = creator.createHero(Mage.class);
hero.attack();
}
}
当然,我们也可以升级一下,变成多个工厂类,以下是类图,代码就不写了。
本文为《设计模式之禅》读后笔记总结