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

    问题:
    1. 需要能够相对轻松地加入一些新的产品类型。
    2. 每一个产品类型都可定制特定的功能。

    概念:
    定义一个用于创建对象的接口,让子类决定实例化哪一个类。

    实现:
    1. 类图示例:

    2. 代码示例:

    //产品抽象基类
    abstract class ApptEncoder
    {
    	abstract public function encode();
    }
    //产品子类1
    class BloggsApptEncoder extends ApptEncoder
    {
    	public function encode()
    	{
    		return "Appointment data encode in BloggsCal format
    ";
    	}
    }
    //产品子类2
    class MegaApptEncoder extends ApptEncoder
    {
    	public function encode()
    	{
    		return "Appointment data encode in MegaCal format
    ";
    	}
    }
    
    //创建者抽象基类
    abstract class CommsManager
    {
    	abstract public function getHeaderText();
    	abstract public function getApptEncoder();
    	abstract public function getFooterText();
    }
    //创建者子类1
    class BloggsCommsManager extends CommsManager
    {
    	public function getHeaderText()
    	{
    		return "BloggsCal header
    ";
    	}
    	public function getApptEncoder()
    	{
    		return new BloggsApptEncoder();
    	}
    	public function getFooterText()
    	{
    		return "BloggsCal footer
    ";
    	}
    }
    //创建者子类2
    class MegaCommsManager extends CommsManager
    {
    	public function getHeaderText()
    	{
    		return "MegaCal header
    ";
    	}
    	public function getApptEncoder()
    	{
    		return new MegaApptEncoder();
    	}
    	public function getFooterText()
    	{
    		return "MegaCal footer
    ";
    	}
    }
    
    //生成产品子类1对象
    $manager1 = new BloggsCommsManager();
    $encoder1 = $manager1->getApptEncoder();
    echo $encoder1->encode();
    //生成产品子类2对象
    $manager2 = new MegaCommsManager();
    $encoder2 = $manager2->getApptEncoder();
    echo $encoder2->encode();
    

    效果:
    优点:
    1. 实现了单一职责原则,创建者类的每一个子类都只需要负责实例化对应的产品子类。
    2. 添加新的产品类型时,只需要添加一个新的产品子类,同时添加一个对应的创建者子类,无需修改原有类,只对扩展开放,不对修改开放,符合开放-封闭原则。
    缺点:
    1. 形成了一种特殊的代码重复,而且可能会导致不必要的子类化。
    2. 客户端需要决定实例化哪个创建者子类。

     

  • 相关阅读:
    [arc067F]Yakiniku Restaurants[矩阵差分]
    [2016北京集训测试赛3]masodik-[凸包]
    [WC2010][BZOJ1758]重建计划-[二分+分数规划+点分治]
    [2016北京集训测试赛7]isn-[树状数组+dp+容斥]
    [BZOJ1565][NOI2009]植物大战僵尸-[网络流-最小割+最大点权闭合子图+拓扑排序]
    [2016北京集训试题7]thr-[树形dp+树链剖分+启发式合并]
    [2016北京集训测试赛1]奇怪的树-[树链剖分]
    [2016北京集训测试赛1]兔子的字符串-[后缀数组+二分]
    模拟 [Sdoi2010]猪国杀
    DP 小奇挖矿2
  • 原文地址:https://www.cnblogs.com/wujuntian/p/9621353.html
Copyright © 2011-2022 走看看