zoukankan      html  css  js  c++  java
  • 生成对象工厂方法模式

    问题

    当代码运行时我们才知道要生成的对象类型(BlogApptEncoder或者MegaBlogApptEncoder)

    我们需要能够相对轻松的加入一些新的产品类型(如一种新业务处理方式SyncMl)

    每一个产品类型都可定制特定的功能(getHeaderText()和getFooterText())

    实现

    <?php
    /*
     factory_method.php
    工厂方法模式把创建者与要生产的产品类分离开,
    创建者是一个工厂类,定义了用于生成产品对象的类方法,
    如果没有提供默认实现,那就有创建者的子类来执行实例化
    一般情况下创建者的每个子类实例化一个相应的产品子类
    */
    
    //产品类
    abstract class AppenCoder{
        abstract function encode();
    }
    
    class BlogsAppEncoder extends AppenCoder{
        function encode(){
            return "Appointment data encode in Blogs";
        }
    }
    
    //创建者,工厂类(用于生成对象的类)
    abstract class CommonManager{
         abstract public function getHearText();
         //生成产品对象的类方法
         abstract public function getAppEncoder();
         abstract public function getFooterText();
    }
    
    class BlogsManager extends CommonManager{
        public function getHearText(){
            return "BlogsCal header";
        }
        /*
        子类实例化一个产品子类
        */
        public function getAppEncoder(){
            return new BlogsAppEncoder();
        }
        public function getFooterText(){
            return "BlogsCal Footer";
        }
    }
    $create = new BlogsManager();
    $obj = $create->getAppEncoder();//得到一个生成的产品对象
    echo $obj ->encode();
    ?>

    uml

    结果

    创建者类与产品的层次结构相似,导致特殊代码重复

    导致不必要的子类化

  • 相关阅读:
    ExceptionExtensions
    implicit operator
    javascript Demo
    KO Demo
    Model Binding
    Await Async Task
    STL查找序列中处于某一大小范围内的元素个数
    2017头条笔试题:二维点集中找出右上角没有点的点并按x坐标从小到大打印坐标
    VS2017新建windows控制台程序打印中文乱码问题
    【详解】Linux的文件描述符fd与文件指针FILE*互相转换
  • 原文地址:https://www.cnblogs.com/rcjtom/p/6055066.html
Copyright © 2011-2022 走看看