工厂方法模式:将实例化的操作延迟到子类,从而降低类之间的耦合度

常常就是在学习设计模式的当下,感觉什么都明白,一合上书,想要借助设计模式让项目变得更加优雅和便于维护,思维就开始变得混沌,怀疑设计模式到底是不是玄学,心想自己开发的小项目好像也没有需要扩展和迭代的需求啊,即便有,直接改代码好像也更快捷吧,如果思想站位够高,看待问题够长远,那么学习设计模式将会帮助你从之前面向具体实现细节的开发方式向更加抽象,更高维度的设计->开发方式过渡。

// 定义了一个抽象工厂,用于获取不同SNS账户以及执行发布操作
abstract class SocialNetworkPoster{
    abstract public function getSocialNetwork():SocialNetworkConnector;
    // post方法依赖于接口SocialNetworkConnector,SNC接口需要声明 login(),createPost(),logout()方法
    public function post($content):void{
        $network = $this->getSocialNetwork();
        $network->login();
        $network->createPost($content);
        $network->logout();
    }
}


// 微博工厂
class WeiboPoster extends SocialNetworkPoster{

    public function getSocialNetwork():SocialNetworkConnector{
        return new WeiboConnector();
    }
}
// Twitter工厂
class TwitterPoster extends SocialNetworkPoster{
    public function getSocialNetwork():SocialNetworkConnector{
        return New TwitterConnector();
    }
}

// 定义社交账户授权及内容发布接口
interface SocialNetworkConnector{
    public function login():void;
    public function logout():void;
    public function createPost($content):void;
}

// 微博账户
class WeiboConnector implements SocialNetworkConnector{

    public function __construct(){
        echo "<h3>Weibo:</h3>";
    }


    public function login():void{
        echo '<br />Weibo User Has Logged In!<hr />';
    }
    public function logout():void{
        echo "Weibo User has Logout! <hr />";
    }
    public function createPost($content):void{
        echo "Weibo ".$content." Content has been Created <hr />";
    }
}

// Twitter 账户
class TwitterConnector implements SocialNetworkConnector{
    public function __construct(){
        echo "<h3>Twitter:</h3>";
    }
    public function login():void{
        echo '404 Not Found!<hr />';
    }

    public function logout():void{
        echo '404 Not Found!<hr />';
    }

    public function createPost($content):void{
        echo '404 Not Found!<hr />';
    }
}

// 模拟客户端调用
class Client{
    function make(SocialNetworkPoster $creator){
        $creator->post('二百斤的猪肉');
    }
}

(new Client)->make(new WeiboPoster());
(new Client)->make(new TwitterPoster());
 

标签: 设计模式

分享到: