zoukankan      html  css  js  c++  java
  • 设计模式

    思考:有一种需求,希望一个类有且只能有一个对象,这样保证对象的完整性,请问该如何实现呢?

    引入:我们将这种一个类最多只能一个对象称为单例,在操作系统中这种方式需求很多,如任务管理器,而通过代码实现这中单例的设计思路我们称为单例模式

    单例模式

    定义:单例模式singleeton,是一种类的设计只会最多产生一个对象的设计思想

    <?php
    
    class singglelon{
    
        //设置属性来保存对象
        private static $object=null;
        //构造方法系优化  不允许在外部实例化
        private  function __construct(){
            echo __METHOD__;
        }
    
        public static function getinfo(){
            // 判断对象   instanceof 是判断一个对象是否属于这个类的 或者子类
            // 当前保存的object 不是singglelon对象
            if(!self::$object instanceof self){
                // 产生对象
                self::$object=new self;
               
            }
            // 返回对象
            return self::$object;
        }
    
    }
    
    $s1=singglelon::getinfo();   //返回同一个对象
    var_dump($s1);
    
    $s2=singglelon::getinfo();   //返回的是同一个对象
    var_dump($s2);
    ?>

    以上方法可以保证无论多少次调用共有静态方法获取实例,都会只能得到一个对象,但是此时外部对象依然可以产生新的对象,因为克隆,所以还必须禁止对象的克隆

    即在类内部私有化克隆方法。

        private function __clone(){
    
        }
    $s3 =clone $s2;     //克隆报错
    var_dump($s3);

    总结

      1.单例模式就是设计的类最多只能得到一个对象

      2.私有化构造方法,禁止在类外无限实例化对象

      3.私有化克隆方法,禁止对象无线克隆对象

      4.私有化静态属性,保存类内部实例化得到的对象

      5.公有化静态方法,允许外部通过调用类内部方法获取对象

      单例模式如果还有其他功能诉求,可以在类中增加相应的其他类成员

      单例模式的目的是为了保护资源唯一性。

    思考:一个类可能在多个地方需要实例化,如数据库,每次操作数据库都要实例化,如果 类名修改,那是不是有很多地方海马要改?

    引入:因为类在实例化对象的时候是new类名实现,所以如果出现类名的修改,那么所有的newv操作的确都需要重新修改代码。如果有一种方式,可以子某个

    地方实现所有的实例化,那么修改就会变得简单,这个就需要工厂模式了

    工厂模式

    定义:工厂模式factory,是指像流水线生产对象,有一个地方生产对象,其他位置就不需要额外实例化对象,从而方便后期代码通过一维护。而且工厂模式可以方便隐藏真实的类结构

    ,因此也更加安全。

    <?php
    
    
    // 男人类
    class man{
        
        public static function show(){
            echo '我是男人';
        }
    }
    
    
    
    
    // 女人类
    class wman{
        public static function show(){
            echo '我是女人';
        }
    }
    
    
    
    // 工厂类
    class factory{
    
        // 同意实例化 生产对象
        public static function  get_instance($class){
            switch($class){
                case 'm';
                    return new man();
                case 'w';
                    return new wman();
                default;
                    return null;
            }
        }
    }
    
    
    $s1= factory::get_instance('w');
    $s1->show();
    ?>
  • 相关阅读:
    String substring(int start,int end)截取当前字符串中指定范围内的字符串
    String字符串是不变对象,内容一旦创建不可改变,若改变一定会创建新对象
    StringBuilder修改字符串内容,增,删,改,插
    startsWith(),endsWith()判断当前字符串是否是以给定字符串开始或结尾的
    length()返回当前字符串的字符个数
    indexOf()字符位置
    charAt()检测回文
    手把手教你猜字小游戏
    release 和 drain
    c专家编程 ,c语言运行时环境
  • 原文地址:https://www.cnblogs.com/xiaowie/p/12241049.html
Copyright © 2011-2022 走看看