zoukankan      html  css  js  c++  java
  • 工厂方法模式

    神剑山庄铸剑

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

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

      此时,我正在思考怎么打造,思考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();
        }

    输出:

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

    后话

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

  • 相关阅读:
    HTML+CSS笔记 CSS进阶续集
    HTML+CSS笔记 CSS进阶
    HTML+CSS笔记 CSS入门续集
    HTML+CSS笔记 CSS入门
    test
    Python Paramiko模块安装和使用
    RedHat升级Python到2.7.6
    python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
    5、使用EF对后台SysSample数据增删改查
    4、创建SQL数据库,添加EF实体数据模型
  • 原文地址:https://www.cnblogs.com/fengyumeng/p/10533519.html
Copyright © 2011-2022 走看看