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

    结果

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

    导致不必要的子类化

  • 相关阅读:
    CAP概述与技术选型
    maven基础命令
    那就从头开始吧,哈哈。
    react 小细节
    二分查找法,折半查找原理
    心态很重要
    apache 软件基金会分发目录。
    jquery的基础知识复习()
    jquery的基础知识复习(基础选择器,属性选择器,层级选择器)
    CPP函数类型转换
  • 原文地址:https://www.cnblogs.com/rcjtom/p/6055066.html
Copyright © 2011-2022 走看看