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

          工厂模式(Factory Pattern)用于将大量有着共同接口的类实例化,工厂模式可以动态地决定将哪一个类实例化。

          工厂模式有以下集中分类:

          简单工厂模式:又称为静态工厂方法模式。

          工厂方法模式:又称为多态性工厂模式。

          抽象工厂模式:又称为工具箱模式。

         

          简单工厂模式的结构如下所示:

          

          单例模式可以看做是简单工厂模式的特殊形式,工厂,具体产品都集中在一个类里面。

          简单工厂模式的核心是工厂类,工厂类中存在判断逻辑,决定在某种情况下创建什么样的实例。

          缺点就是对于工厂类过于依赖,增加新的具体产品时需要修改工厂类的实现逻辑。

          

         public class HumanBuilder{

              public static Human build(String sex){

                   if(sex.equalsIgnoreCase("male")){

                         return new ZhangSan();

                  }else if(sex.equalsIgnoreCase("female")){

                        return new Lisi();

                  }

              }

         }

         系统中需要创造新的人类的地方可以使用:

         HumanBuilder.build("male");

         HumanBuilder.build("female");

         工厂方法模式

         工厂方法模式是简单工厂模式的抽象和推广。

         

          FruitGardener是工厂方法模式的核心,但是FruitGardener不再负责生产具体的对象,而是由其子类去负责生产。

          Class AppleGardener implements FruitGardener{

                  private AppleGardener(){}

                  private static AppleGardener gardener = null;

                  public synchronized static AppleGardener getInstance(){
                           if(gardener == null){

                                   gardener = new AppleGardener();

                           }

                           return gardener;

                  }

                  public  Fruit factory(){

                          return  new Apple();

                   }

          }

          需要获取Apple对象时可以使用:

          Fruit  apple  = AppleGardener.getInstance().factory();

          工厂可以每次创建一个新的对象以供使用,也可以只创建一个对象,将对象加入到某个集合中。有获取对象的请求时,先去集合中查找有无合适的实例,有则直接返回,没有就创建并保存至集合,这就是享元模式。

         

         

           抽象工厂模式

           抽象工厂模式是工厂模式最为抽象和最具一般性的形态。

          

           

             “开-闭”原则要求要求一个软件系统在不修改代码的前提下,通过扩展以达到增强功能的目的。    

            Class UnixFactory implements AbstractFactory{

                  private UnixFactory (){}

                  private static UnixFactory factory = null;

                  public synchronized static UnixFactory getInstance(){
                           if(factory == null){

                                   factory = new UnixFactory ();

                           }

                           return factory;

                  }

                  public  Button createButton{

                          return  new UnixButton();

                   }             

                  public  Text createText{

                          return  new UnixText();

                   }

          }   

          需要获取UnixButton对象时可以使用:

          Button button  = UnixFactory .getInstance().createButton();

            

          实际开发工作中利用XML做配置文件,再从XML文件中读取类的名称并实例化也可以看做工厂模式的变种。

         <?xml version="1.0"?>

          <Apple>

             <Constructor Class ="com.AppleConstructor"/>

         </Apple>

         <Pear>

             <Constructor Class ="com.PearConstructor"/>

         </Pear> 

         ObjService 0bj = XMLFileParser.parse("text.xml");

         String  appleConstructor = 0bj.objectAt(0).getString('"Class");

         Fruit apple = Class.forName(appleConstructor).newInstance().construct();

  • 相关阅读:
    PAT甲题题解1099. Build A Binary Search Tree (30)-二叉树遍历
    PAT甲题题解1098. Insertion or Heap Sort (25)-(插入排序和堆排序)
    PAT甲级题解-1097. Deduplication on a Linked List (25)-链表的删除操作
    字典树trie的学习与练习题
    POJ 1273 Drainage Ditches(网络流dinic算法模板)
    单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板
    Hungary(匈牙利算法)——二分图最大匹配
    LCIS 最长公共上升子序列
    POJ 1151 Atlantis(经典的线段树扫描线,求矩阵面积并)
    Codeforces 494D Upgrading Array
  • 原文地址:https://www.cnblogs.com/lnlvinso/p/3792645.html
Copyright © 2011-2022 走看看