工厂方法模式

工厂方法模式

定义

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

通用类图

工厂方法.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 extends Product> T createProduct(Class<?> c);
}
  1. 具体工厂类
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;
    }
}
  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 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();
    }
}

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

多个工厂类.png

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容