第二十六章 享元模式(项目多也别傻做)

  1. class User
  2. {
  3. private $name;
  4. function __construct($name)
  5. {
  6. $this->name = $name;
  7. }
  8. public function getName()
  9. {
  10. return $this->name;
  11. }
  12. }
  13. abstract class WebSite
  14. {
  15. abstract public function use(User $user);
  16. }
  17. // 具体网站类
  18. class ConcreteWebSite extends WebSite
  19. {
  20. private $name = '';
  21. function __construct($name)
  22. {
  23. $this->name = $name;
  24. }
  25. public function use(User $user)
  26. {
  27. echo "网站分类: ".$this->name."用户:".$user->getName()."\n";
  28. }
  29. }
  30. //网站工厂
  31. class WebSiteFactory
  32. {
  33. private $flyweights = [];
  34. public function getWebSiteGategory($key)
  35. {
  36. if (empty($this->flyweights[$key])) {
  37. $this->flyweights[$key] = new ConcreteWebSite($key);
  38. }
  39. return $this->flyweights[$key];
  40. }
  41. public function getWebSiteCount()
  42. {
  43. return count($this->flyweights);
  44. }
  45. }
  46. $f = new WebSiteFactory();
  47. $fx = $f->getWebSiteGategory('产品展示');
  48. $fx->use(new User('张伟'));
  49. $fy = $f->getWebSiteGategory('产品展示');
  50. $fy->use(new User('王伟'));
  51. $fz = $f->getWebSiteGategory('产品展示');
  52. $fz->use(new User('王芳'));
  53. $fl = $f->getWebSiteGategory('博客');
  54. $fl->use(new User('李伟'));
  55. $fm = $f->getWebSiteGategory('博客');
  56. $fm->use(new User('王秀英'));
  57. $fn = $f->getWebSiteGategory('博客');
  58. $fn->use(new User('李秀英'));
  59. echo "网站分类总数:".$f->getWebSiteCount()."\n";

总结

享原模式 运用共享技术有效地支持大量细粒度的对象

享原模式可以避免大量非常类似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够受大幅度地减少需要实例化的类的数量。如果能把参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度地减少单个实例的数目。

如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享原模式。