工厂模式-工厂方法模式

归类于php | 设计模式 参与评论

工厂模式就是负责将大量有共同接口的类实例,而不必事先知道要实例化哪一个类的模式。工厂模式一般分为三种:简单工厂模式、工厂方法模式、抽象工厂模式。从模式性质来说,工厂模式属于创建型模式。

工厂方法定义

工厂方法模式又称为工厂模式,也叫虚拟构造器(Virtual Construct)模式或者多态工厂模式(Polymorphic Factory),在工厂模式中,父类负责定义创建对象的接口,而真正实现创建对象的任务交给子类去实现。这样作的目的是将创建对象的工作延迟到子类中去完成,由子类决定生成哪个具体的对象。

相对模于简单工厂模式来说,工厂方法模式解决了简单工厂模式的缺点-违反开放-封闭原则,将添加更多的产品种类以扩展方式就能实现,而不必去修改工厂类或者产品类。

<?php

// Factory Method

interface IAnimal {
    function Eat();
}

class Dog implements IAnimal {

    public function Feed() {
        echo "Dog Eat!\n";
        echo "<br/>";
    }
}

class Cat implements IAnimal {

    public function Eat() {
        echo "Cat Eat!";
        echo "<br/>";
    }
}

interface Feeder {
    function Feed();
}

class DogFeeder implements Feeder {

    public function Feed() {
        return new Dog();
    }
}

class CatFeeder implements Feeder {

    public function Feed() {
        return new Cat();
    }
}

// Test
$DogFeeder = new DogFeeder();
$Dog = $DogFeeder->Feed();
$Dog->Eat();

$CatFeeder = new CatFeeder();
$Cat = $CatFeeder->Feed();
$Cat->Eat();

?&gt;

上面代码中,我们将喂养动物的任务交给对应喂养动物的子类DogFeeder/CatFeeder去执行,不是在Feeder类中去写逻辑判断该喂养哪一动物。

优点

我们要另外加一新的品种动物的喂养,只需要新增一个动物类以及动物喂养类,然后在主逻辑代码里直接使用对应的动物喂养类调用喂养该动物就好,而不必去修改现在的代码,在遵循开放-封闭原则基础上做到很好的对现有系统的扩展。

缺点

我觉得没什么缺点,唯一缺点就是新增喂养动物需要新写动物类以及具体的动物喂养类,但是这个是必须的呀。

应用场景

  • 类不知道自己要创建哪个对象
  • 类由它的子类类确定创建哪个对象
  • 类将创建对象的职责交个它的子类去实现

工厂模式-简单工厂模式

归类于php | 设计模式 参与评论

工厂模式就是负责将大量有共同接口的类实例,而不必事先知道要实例化哪一个类的模式。工厂模式一般分为三种:简单工厂模式、工厂方法模式、抽象工厂模式。从模式性质来说,工厂模式属于创建型模式。

简单工厂模式定义

通常负责创建实例工厂类接收一个条件(参数),来决定实例化哪一个产品类。简单工厂模式又被称为静态工厂模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

<?php

// Simple Factory

interface IAnimal {
    function Eat();
}

class Dog implements IAnimal {
    public function Eat() {
        echo "Dog Eat!";
        echo "<br/>";
    }
}

class Cat implements IAnimal {
    public function Eat() {
        echo "Cat Eat!";
        echo "<br/>";
    }
}

class SimpleFactory {
    function CreateAnimal($animal_type) {
        switch ($animal_type) {
            case 'Dog':
                return new Dog();break;
            case 'Cat':
                return new Cat();break;
            default:
                exit('Please provide the type of animal you wana to create!');
        }
    }
}

// Test
$simplefactory = new SimpleFactory();
$dog = $simplefactory->CreateAnimal('Dog');
$dog->Eat();

$cat = $simplefactory->CreateAnimal('Cat');
$cat->Eat();
?>

优点

SimpleFactory根据接收不同的参数实例化不同的动物,对动物的实例化统一交给SimpleFactory工厂类来实现,客户端不必知道动物类的具体名称或者怎么去完成实例化,而只需使用SimpleFactory类以及对应的实例化某动物的参数(“Dog”或者”Cat”等)来实例某动物就可以了。

缺点

整个模式的关键是SimpleFactory类,其中SimpleFactory创建动物方法中包含了创建动物的关键逻辑,而这往往容易违反高内聚的责任分配原则,也违反开放-封闭原则,因为要添加新的动物时候,必须修改SimpleFactory的CreateAnimal方法,而开发-封闭原则是对扩展是开放的(Open for extension),而对修改是封闭的(Close for modification)。

PHP设计模式之-单例模式

归类于php | 设计模式 2 条评论

很多朋友学习接触设计模式的时候都是从单例模式、工厂模式等广泛应用的模式开始的,今天就来说说PHP的单例模式。

单例模式,也叫单子模式,使用这个模式时候,单例对象的类只能生成一个实例。恰是只能唯一生成一个类的实例对象在有的场合里面特别合适好用。比如:

  1. 系统的数据库连接对象的创建(创建多个对象既耗资源又不方便管理)
  2. 某个系统全局配置对象(同理)
  3. 系统统计模块对象(同理)
  4. 更多…

那么,一个单例类需要满足什么样的条件呢?

  1. 类的构造方法必须为私有的,即Private。(这样外部就不能通过new来创建多个实例了,我们而是通过使用一个公共的方法get_instance()得到该类的实例对象)
  2. 拥有一个保存该类实例对象的私有的静态属性$instance。(在上一步,私有构造函数执行后,把刚实例化的对象存储在这里,供get_instance()获得实例对象)
  3. 拥有一个对外获取该类实例对象的公共方法get_instance()。(对外获得单例类实例对象的公共接口)

那么按照上面这三个条件写出来的一个单例模式类如下(懒汉模式):

class singleton {

private static $instance = null;

private function __construct() {}

public static function get_instance() {

if (!self::$instance instanceof self) {
self::$instance = new self();
}

return self::$instance;
}
}
?>

单例模式的实现又有两种,懒汉模式饿汉模式,上面的DEMO代码示例就是懒汉模式的实现。
懒汉模式,即实例的初始化交给第一次使用的时候构建
饿汉模式,即实例的初始化在类的装载的时候就构建
下面也给出恶汉模式的实现:

class singleton {

private static $instance = new self();

private function __construct() {}

public static function get_instance() {
return self::$instance;
}
}
?>

注意:在多线程下使用单例模式的时候必须得特别小心,如果当唯一实例尚未创建时,有两个或多个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个或多个实例被构造出来,从而违反了单例模式中实例唯一的原则。理论上解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁,即我们可以把互斥锁加在singleton::$instance变量上,还好,PHP是单线程的,不知道模拟出来的多线程会造成单例模式的线程不安全么?以及其他语言天生就具备这样条件,比如JAVA的synchronized关键字.

设计模式学习(一)

归类于php | 设计模式 参与评论

软件设计模式一直来都在断断续续的学习研究,但是从来没有系统的去学习一遍。二来,好像从事开发以来都没有好好的去经营管理自己的技术博客,主要是不太喜欢花几个小时去认真写一篇技术文章,其实自己心里是很愿意自己能一点点的在博客上做点积累的,那么就从软件设计模式系列开始吧。打算把所有的设计模式包括三大类:创建型模式、结构型模式、行为模式一点点来系统的学习与做笔记记录吧!

先做下列表,计划在半年内完成所有设计模式的学习笔记吧!(标记红色的为已完成)

一、创建型

  1. Abstract Factory(虚拟工厂模式)
  2. Builder(创造者模式)
  3. Factory Method(工厂方法模式)
  4. Prototype(原型模式)
  5. Singleton(单例模式)

二、结构型模式

  1. Adapter(适配器模式)
  2. Brigde(桥接模式)
  3. Composite(组合模式/合成模式)
  4. Decorator(装饰模式)
  5. Facade(外观模式)
  6. Flyweight(享元模式)
  7. Proxy(代理模式)

三 、行为模式

  1. Chain Of Responsibility(责任链模式)
  2. Command(命令模式)
  3. Interpreter(解释器模式)
  4. Iterator(迭代器模式)
  5. Mediator(中介者模式)
  6. Memento(备忘录模式)
  7. Observer(观察者模式)
  8. State(状态模式)
  9. Strategy(策略模式)
  10. Template Method(模板方法模式)
  11. Visitor(访问者模式)

当年被F4找出的设计模式总共就这23种吧,然后每个设计模式都有一些变种,不过都差不多这样子,里面常用到的一些模式应该一看到就能马上想到,比如Singleton、Prototype、Abstract Factory、Factory Method、Template、Iterator、Adapter等等,相信大家都很熟悉了,然后呢,不管怎样,接下来的日子就一个个来仔细的过一遍吧!

顶部