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模式共同组合来应对”对象创建“的需求变化。

  • 相关阅读:
    Vue双向绑定的实现原理系列(一):Object.defineproperty
    TCP协议中的三次握手和四次挥手
    一切事物皆对象_进阶篇
    一切事物皆对象_基础篇
    自成一派的正则表达式
    超好用的模块
    软件目录开发规范
    迭代器与生成器
    不怎么好吃的语法糖
    你可造什么是函数
  • 原文地址:https://www.cnblogs.com/hyp5490-/p/3757781.html
Copyright © 2011-2022 走看看