工厂方法模式

工厂方法模式

定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其他子类。

通用类图

工厂方法.png

通用代码

  1. 抽象产品类
    public abstract Product {
        public void method() {} // 抽象产品的公有方法
        public abstract method2();
    }
  1. 具体产品类
    public ConcreteProduct1 extends Product {
        public abstract method2() {
            // 具体逻辑
        }
    }

    public ConcreteProduct2 extends Product {
        public abstract method2() {
            // 具体逻辑
        }
    }
  1. 抽象工厂类
public abstract class Creator {
    public abstract  T createProduct(Class c);
}
  1. 具体工厂类
public class ConcreteCreator extends Creator {
    public abstract  T createProduct(Class c) {
        Product product = null;
        try {
            product = (Product)Class.forName(c.getInstance()).newInstance();
        } catch(Expection e) {
            // 异常处理
        }
        return (T)product;
    }
}
  1. 使用
    public static void main(String[] args) {
        Creator creator = new ConcreteCreator();
        Product product = creator.createProduct(ConcreteProduct1.class);
    }

样例展示

现在召唤师峡谷需要一批英雄,有法师、战士、刺客什么的,那么我们就可以这样使用工厂方法模式。


英雄工厂方法.png

先定义一个抽象的英雄:

public abstract class Hero {
    public abstract void attack();
}

要创造英雄总得创造设备吧,所以定义一个工厂:

public abstract class Creator {
    public abstract  T createHero(Class c);
}

接下来是创造出具体的东西:

// 具体工厂
public class HeroCreator extends Creator {
    @Override
    public  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();
    }
}

当然,我们也可以升级一下,变成多个工厂类,以下是类图,代码就不写了。

多个工厂类.png

本文为《设计模式之禅》读后笔记总结

你可能感兴趣的:(工厂方法模式)