博客列表 >02月18日作业:设计模式(单例模式和工厂模式)

02月18日作业:设计模式(单例模式和工厂模式)

李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰
李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰原创
2020年02月20日 18:44:54728浏览

作业一:单例模式

1、代码:

  1. <?php
  2. namespace mode;
  3. class Single
  4. {
  5. private static $mysql=null;
  6. private function __construct(...$linkParams)
  7. {
  8. list($dsn,$username,$password)=$linkParams;
  9. self::$mysql=new \PDO($dsn,$username,$password);
  10. }
  11. private function __clone()
  12. {
  13. // …………
  14. }
  15. public static function getnew(...$linkParams)
  16. {
  17. if (is_null(self::$mysql)) {
  18. new self(...$linkParams);
  19. }
  20. return self::$mysql;
  21. }
  22. }
  23. $link=['mysql:host=NewYear.com;dbname=php','phptest','123456'];
  24. $mysql=Single::getnew(...$link);
  25. $my=Single::getnew(...$link);
  26. var_dump($mysql===$my);
  27. echo '<pre>'.print_r($mysql->query('select * from `staffs`')->fetchAll(\PDO::FETCH_ASSOC),true).'</pre>';

运行结果图:

作业二:工厂模式(抽象类)工厂类是把多个类的实例化集中到一个类中,本质没有变;

1、目录结构:

2、Minus.php代码:

  1. <?php
  2. namespace base\method;
  3. class Minus
  4. {
  5. public $num1;
  6. public $num2;
  7. public function __construct($num1,$num2)
  8. {
  9. $this->num1=$num1;
  10. $this->num2=$num2;
  11. }
  12. public function get_result()
  13. {
  14. $c = $this->num1 - $this->num2;
  15. return '相减结果是:'.$c;
  16. }
  17. }

3、Plus.php代码:

  1. <?php
  2. namespace base\method1;
  3. class Plus implements Post
  4. {
  5. public $num1;
  6. public $num2;
  7. public function __construct($num1,$num2)
  8. {
  9. $this->num1=$num1;
  10. $this->num2=$num2;
  11. }
  12. public function get_result()
  13. {
  14. $c = $this->num1 + $this->num2;
  15. return '相加结果是:'.$c;
  16. }
  17. }
  18. // $plus=new Plus(1,2);
  19. // echo $plus->get_result();

4、Ride.php代码:

  1. <?php
  2. namespace base\method1;
  3. class Ride implements Post
  4. {
  5. public $num1;
  6. public $num2;
  7. public function __construct($num1,$num2)
  8. {
  9. $this->num1=$num1;
  10. $this->num2=$num2;
  11. }
  12. public function get_result()
  13. {
  14. $c = $this->num1 * $this->num2;
  15. return '相乘结果是:'.$c;
  16. }
  17. }

5、Post.php代码:

  1. <?php
  2. namespace base\method1;
  3. interface Post
  4. {
  5. public function get_result();
  6. }

6、demo3.php代码:

  1. <?php
  2. namespace part1;
  3. use base\method1\Minus;
  4. use base\method1\Plus;
  5. use base\method1\Ride;
  6. use base\method1\Post;
  7. require __DIR__.DIRECTORY_SEPARATOR.'autoload.php';
  8. class Count1
  9. {
  10. public function yunsuan(Post $class)
  11. {
  12. return $class->get_result();
  13. }
  14. }
  15. echo (new Count1())->yunsuan(new Plus(1,2)) . '<br>';
  16. echo (new Count1())->yunsuan(new Minus(4,5)) . '<br>';
  17. echo (new Count1())->yunsuan(new Ride(3,9)) . '<br>';

6、运行结果图:

作业三:知识点总结:

1、clone:复制关键字(对象);$new=new Mysql();$s=clone $new;
2、__clone();复制对象实列,无法直接备调用;
3、通过私有化(private)__construct()__clone()来禁止类实列化和复制;
4、spl_autoload_register():自动加载器(闭包);
5、__DIR__dirname()区别:__DIR__和dirname(__FILE__)功能一致;
6、require 'demo.php';加载关键字:require
7、接口类关键字interface:interface Post{}
8、继承接口类关键字implements:class Mode implements Post{};
9、类继承关键字:extends
10、抽象类和方法关键字:abstract 继承抽象类的关键字:extends

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议