工厂方法模式

神剑山庄铸剑

  大家好,我是神剑山庄的铸剑师,名叫小赵,昨天入的职,在山庄里逛了一圈,熟悉了一下企业文化,今天就收到了任务,三少爷吩咐下来,要我们尽快打造三把神剑:倚天剑、游龙剑、轩辕剑,据说三少爷要去参加华山论剑。

  铸剑经理对我的印象很好,把这个任务安排给我做。

  此时,我正在思考怎么打造,思考ing....

  既然都是剑,那么就应该有共同的抽象,所以类图我觉得可以这样设计:

好的,既然设计完成,那我就开始干活了:

//剑的抽象
public interface Sword {
    void getName();//每把剑都有名字
}
//倚天剑
public class YitianSword implements Sword {
    @Override
    public void getName() {
        System.out.println("倚天剑出世!");
    }
}
//轩辕剑
public class XuanyuanSword implements Sword {
    @Override
    public void getName() {
        System.out.println("轩辕剑出世!");
    }
}
//游龙剑
public class YoulongSword implements Sword {
    @Override
    public void getName() {
        System.out.println("游龙剑出世!");
    }
}

铸剑:

public static void main(String[] args) {
        Sword yitian = new YitianSword();
        Sword xuanyuan = new XuanyuanSword();
        Sword youlong = new YoulongSword();
        yitian.getName();
        xuanyuan.getName();
        youlong.getName();
    }

输出:

倚天剑出世!
轩辕剑出世!
游龙剑出世!

当我拿着程序去给铸剑经理过目时,却被骂了一顿。。。

“你是SB吗?铸个剑在室外铸!铸剑的过程都被所有人看到了!还搞的灰尘满天飞,赶紧的,滚去铸剑房干活去!”

当我一脸懵逼的往铸剑房走时,后面经理又喷了一句话出来:“不许用共用的铸剑房,你自己收拾一个铸剑房去!”

。。。。。。

铸剑房

  OK,既然要在铸剑房里铸剑,那我也能做,不就是把铸剑的过程移到铸剑房里吗?No Problem!

铸剑房:

//铸剑房
public class SwordFactory{
    public static <T extends Sword> Sword createSword(Class<T> c) {
        Sword sword = null;
        try{
            sword = (Sword)Class.forName(c.getName()).newInstance();
        }catch (Exception e){
            System.out.println("铸剑失败"+e.getMessage());
        }
        return sword;
    }
}

铸剑:

public static void main(String[] args) {
        Sword yitian = SwordFactory.createSword(YitianSword.class);
        Sword xuanyuan = SwordFactory.createSword(XuanyuanSword.class);
        Sword youlong = SwordFactory.createSword(YoulongSword.class);
        yitian.getName();
        xuanyuan.getName();
        youlong.getName();
    }

输出:

倚天剑出世!
轩辕剑出世!
游龙剑出世!

然后,我又拿着程序去找经理过目了。

这次经理的脸色要缓和许多。

“小赵,你这个程序看起来是没有什么问题。但是,你不诚实。”

“经理,我不明白您讲的是什么不诚实?”

“你这个铸剑房顶多算个简单工厂,也叫做静态工厂模式,你入职面试的时候,说你学过六大设计原则,你这个铸剑房违背了开闭原则你不知道吗?假如说我要你打造一批飞刀暗器,都不属于剑这个类别,你这个铸剑房的怎么扩展?是不是得修改源码改动现有铸剑的逻辑?”

“经理,我错了,我这就去改。”

说罢,我立刻回到铸剑房进行思考

铸剑房工厂

  事不过三,这次我铁了心一定要把这个架构设计好,这已经不仅仅是打造三把兵器的问题了,这是一个关于设计的问题。

  先画类图:

仔细检查了几遍,确实遵守了开闭原则,如果将来要打造什么飞刀暗器的,我就继承SwordFactory,重写createSword方法,或者是直接继承工厂抽象AbstractFactory新开一个铸剑房,都可以不修改原有的代码。

好了,设计完成后,就敲代码吧:

工厂抽象:

//铸剑房抽象
public abstract class AbstractFactory {
    //打造剑的铸剑房工厂
    public abstract <T extends Sword> Sword createSword(Class<T> c);
}

工厂实现:

//铸剑房
public class SwordFactory extends AbstractFactory{
    @Override
    public <T extends Sword> Sword createSword(Class<T> c) {
        Sword sword = null;
        try{
            sword = (Sword)Class.forName(c.getName()).newInstance();
        }catch (Exception e){
            System.out.println("铸剑失败"+e.getMessage());
        }
        return sword;
    }
}

铸剑:

public static void main(String[] args) {
        AbstractFactory factory = new SwordFactory();
        Sword yitian = factory.createSword(YitianSword.class);
        Sword xuanyuan = factory.createSword(XuanyuanSword.class);
        Sword youlong = factory.createSword(YoulongSword.class);
        yitian.getName();
        xuanyuan.getName();
        youlong.getName();
    }

输出:

倚天剑出世!
轩辕剑出世!
游龙剑出世!

后话

  后来,我打造出的三把神剑,为三少爷出尽了风头,华山论剑凯旋回庄之后,重重的赏了我。

(0)

相关推荐

  • 殷浩详解DDD:领域层设计规范

    在一个DDD架构设计中,领域层的设计合理性会直接影响整个架构的代码结构以及应用层.基础设施层的设计.但是领域层设计又是有挑战的任务,特别是在一个业务逻辑相对复杂应用中,每一个业务规则是应该放在Enti ...

  • 装饰模式

    大家好,我叫小赵,现任职藏剑山庄高级铸剑师,今天抽空跟大家唠唠嗑,希望能赚几个点击,赚几个关注. 我们山庄每天都会出很多货,每把武器打造出来之后,会进行包装,因为大众化的口味总是需要各种各样的点缀,因 ...

  • PHP设计模式—装饰器模式

    定义: 装饰器模式(Decorator):动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器比生成子类更加灵活. 结构: Component:定义一个对象接口,可以给这些对象动态地添加职责. ...

  • 【7/25】使用工厂方法模式(Factory Method Pattern)创建Page页面对象

    这是<小游戏从0到1设计模式重构>系列内容第7篇,所有源码及资料在"程序员LIYI"公号回复"小游戏从0到1"获取. 看完三姐妹中的简单工厂模式,再 ...

  • PHP设计模式之工厂方法模式

    PHP设计模式之工厂方法模式 上回说到,简单工厂不属于GoF的二十三种设计模式,这回可就来真家伙了,大名顶顶的工厂方法模式前来报道! GoF类图解释 工厂方法模式对比简单工厂来说,最核心的一点,其实就 ...

  • [PHP小课堂]PHP设计模式之工厂方法模式

    [PHP小课堂]PHP设计模式之工厂方法模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • FactoryMethodPattern工厂方法模式

    工厂方法模式 1.定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 基本工厂方法模式 抽象产品类 public abstract class Abst ...

  • 设计模式(1) 工厂方法模式

    创建型模式 简单工厂模式 工厂方法模式 IOC与工厂方法模式的结合 泛型工厂 委托工厂 创建型模式 创建型模式可以隔离客户程序对需要实例化类型的依赖关系,这类模式一般通过将实例化具体对象的职责委托给第 ...

  • 【设计模式】工厂方法模式

    定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类 优缺点 优点 针对简单工厂不容易扩展,工厂方法将实例化延迟到子类工厂,从而提供扩展 缺点 每次新增产品 ...

  • 【设计模式】工厂方法模式(Factory Method)

    工厂方法模式(Factory Method) 工厂方法模式分为三种: 1.普通工厂模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.首先看下关系图:举例如下:(我们举一个发送邮件和短信 ...

  • 大白话工厂方法模式(Factory Method)

    目录 简单工厂模式缺陷 简单工厂模式改造 工厂方法模式定义 工厂方法模式结构 工厂方法模式分析 优点分析 缺点分析 参考文献 简单工厂模式缺陷 大白话简单工厂模式(Simple Factory Pat ...

  • 大话设计模式笔记(六)の工厂方法模式

    栗子回顾 简单工厂模式: https://www.cnblogs.com/call-me-devil/p/10926633.html 运算类使用工厂方法模式实现 UML图 代码实现 工厂接口 /** ...

  • 设计模式-工厂方法模式学习笔记

    工厂方法模式 定义 工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负 ...