zoukankan      html  css  js  c++  java
  • 抽象工厂

    提供一个接口,让该接口负责创建一系列的”相关或者相互依赖的对象“,无需指定他们具体的类。封装变化点》》

    一个游戏:需要路,建筑物,隧道,丛林(这些对象不能再增加,否则不是抽象工厂模式,先看例子,后面解释),这些东西有两个风格1:modern 2:classic抽象工厂应用

    abstract class Road{ abstract AAA();}

    abstract class Building{abstract  BBB(Road r);}

    abstract class Tunnel{abstract CCC();}

    abstract class Jungle{abstract DDD(Tunnel t);}

    abstract class FecilitiesFactory{//

     public abstract Road CreatRoad();

     public abstract Building CreatBuilding();

     public abstract Tunnel CreatTunnel();

     public abstract Jungle CreatJungle();

    }

    面向接口编程;

    客户端程序:不涉及具体的代码,全是抽象的

    class GameManager {

       private FecilitiesFactory fecilitiesFactory;

     Road road;

    Buieding building;

    Tunnel   tunnel;

    Jungle  jungle ;

       public GameManger( FecilitiesFactory fecilitiesFactory){ this. fecilitiesFactory= fecilitiesFactory;}

       

       public void BuildFecilities(){

           road=fecilitiesFactory.CreatRoad(); 

           building= fecilitiesFactory.CreatBuilding(); 

           tunnel = fecilitiesFactory.CreatTunnel();

           jungle = fecilitiesFactory.CreatJungle();

      }

    public run(){

        road.AAA();

       building.BBB(road);

       tunnel.CCC();

        jungle.DDD(tunnel);

    }

    }

     class APP{

         GameManager g= new GameManager(  有两种选择1: new  ModernFecilitiesFactory() 2 :new  ClassicFecilitiesFactory()  );

         g.BuildFecilities();

         g.run();

    }

     //现代风格具体实现

     class ModernRoad extends Road{             AAA(){};             }

     class ModernBuilding extends Building{           BBB(Road r){};           }

     class ModernTunnel extends Tunnel{             CCC(){};          }

     class ModernJungle extends Jungle{        DDD(Tunnel t){};       }

     class ModernFecilitiesFactory extends FecilitiesFactory{//

     public  Road CreatRoad(){   return new ModernRoad();   };

     public  Building CreatBuilding(){ return new ModernBuilding();   };

     public  Tunnel CreatTunnel(){ return new ModernTunnel();  };

     public  Jungle CreatJungle(){ return new ModernJungle();  };

    }

     //古典风格具体实现

     class ClassicRoad extends Road{             AAA(){};             }

     class ClassicBuilding extends Building{           BBB(Road r){};           }

     class ClassicTunnel extends Tunnel{             CCC(){};          }

     class ClassicJungle extends Jungle{        DDD(Tunnel t){};       }

     class ClassicFecilitiesFactory extends FecilitiesFactory{//

     public  Road CreatRoad(){   return new ClassicRoad();   };

     public  Building CreatBuilding(){ return new ClassicBuilding();   };

     public  Tunnel CreatTunnel(){ return new ClassicTunnel();  };

     public  Jungle CreatJungle(){ return new ClassicJungle();  };

    }

      

    复杂的代码在GameManager里,当风格发生变化后,不会影响到GameManager里的代码,但如果你的系统变化点在各种物体上,比如又要添加沙漠,就不能再用这个模式啦,要根据你的系统变化的点在哪里,之后决定使用哪种模式。

    模式要点:

    1:如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式,这时候使用简单的静态工厂完全可以。

    2:“系列对象”指的是这些对象之间有相互依赖,或者作用的关系,例子如游戏开发场景中的道路与房屋的依赖,道路与地道的依赖。

    3:Abstract Factory模式主要在于应对“新系列”的需求变动。其缺点在于难以应对“新对象”的需求变动。

    4:Abstract Factory模式经常和Abstract Method模式共同组合来应对”对象创建“的需求变化。

  • 相关阅读:
    1269 匈牙利游戏 2012年CCC加拿大高中生信息学奥赛
    2577 医院设置
    2488 绿豆蛙的归宿
    3315 时空跳跃者的魔法
    1079 回家
    1365 浴火银河星际跳跃
    1074 食物链 2001年NOI全国竞赛
    2596 售货员的难题
    wetask.cn领度任务全新试用体验
    多线程--生产者消费者--简单例子
  • 原文地址:https://www.cnblogs.com/hyp5490-/p/3757781.html
Copyright © 2011-2022 走看看