设计模式-工厂模式

1. 概念

工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。它的好处就是当你想要更改所实例化的类名时,只需更改该工厂方法内容即可,不需逐一寻找代码中具体实例化的地方(new处)修改了。为系统结构提供灵活的动态扩展机制,减少了耦合。

2. 工厂模式分类

2.1. 简单工厂模式

又被称为静态工厂方法模式,它属于类创建型模式,可以根据参数的不同返回不同的类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。其优点是:实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责;但缺点是:工厂类不够灵活,增加新的具体实例需要修改工厂类的判断逻辑代码,而且实例较多时,工厂方法代码将会非常复杂。

  <?php 
  class Cat
  {
      function __construct()
      {
          echo "I am Cat class <br>";
      }
  }
  class Dog
  {
      function __construct()
      {
          echo "I am Dog class <br>";
      }
  }
  class Factory
  {
      public static function CreateAnimal($name){
          if ($name == 'cat') {
              return new Cat();
          } elseif ($name == 'dog') {
              return new Dog();
          }
      }
  }

  $cat = Factory::CreateAnimal('cat');
  $dog = Factory::CreateAnimal('dog');

2.2. 工厂方法模式

在此模式中,通过定义一个抽象的核心工厂类,并定义创建产品对象的接口,创建具体产品实例的工作延迟到其工厂子类去完成。这样做的好处是核心类只关注工厂类的接口定义,而具体的产品实例交给具体的工厂子类去创建。当系统需要新增一个产品,无需修改现有系统代码,只需要添加一个具体产品类和其对应的工厂子类,使系统的扩展性变得很好,符合面向对象编程的开闭原则。

  <?php 
  interface Animal{
      public function run();
      public function say();
  }
  class Cat implements Animal
  {
      public function run(){
          echo "I ran slowly <br>";
      }
      public function say(){
          echo "I am Cat class <br>";
      }
  }
  class Dog implements Animal
  {
      public function run(){
          echo "I'm running fast <br>";
      }
      public function say(){
          echo "I am Dog class <br>";
      }
  }
  abstract class Factory{
      abstract static function createAnimal();
  }
  class CatFactory extends Factory
  {
      public static function createAnimal()
      {
          return new Cat();
      }
  }
  class DogFactory extends Factory
  {
      public static function createAnimal()
      {
          return new Dog();
      }
  }

  $cat = CatFactory::createAnimal();
  $cat->say();
  $cat->run();

  $dog = DogFactory::createAnimal();
  $dog->say();
  $dog->run();

2.3. 抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

<?php 

interface TV{
  public function open();
  public function watch();
}

class HaierTv implements TV
{
  public function open()
  {
      echo "Open Haier TV <br>";
  }

  public function watch()
  {
      echo "I'm watching Haier TV <br>";
  }
}

class LenovoTv implements TV
{
  public function open()
  {
      echo "Open Lenovo TV <br>";
  }

  public function watch()
  {
      echo "I'm watching Lenovo TV <br>";
  }
}

interface PC{
  public function work();
  public function play();
}

class LenovoPc implements PC
{
  public function work()
  {
      echo "I'm working on a Lenovo computer <br>";
  }
  public function play()
  {
      echo "Lenovo computers can be used to play games <br>";
  }
}

class HaierPc implements PC
{
  public function work()
  {
      echo "I'm working on a Haier computer <br>";
  }
  public function play()
  {
      echo "Haier computers can be used to play games <br>";
  }
}

abstract class Factory{
  abstract public static function createPc();
  abstract public static function createTv();
}

class HaierFactory extends Factory
{
    public static function createTv()
    {
        return new HaierTv();
    }

    public static function createPc()
    {
        return new HaierPc();
    }

}

class LenovoFactory extends Factory
{
    public static function createTv()
    {
        return new LenovoTv();
    }

    public static function createPc()
    {
        return new LenovoPc();
    }

}

$haierFactory = new HaierFactory();
$haierTv = $haierFactory->createTv();
$haierTv->open();
$haierTv->watch();

$haierPc = $haierFactory->createPc();
$haierPc->work();
$haierPc->play();

$lenovoFactory = new LenovoFactory();
$lenovoPc = $lenovoFactory->createPc();
$lenovoPc->work();
$lenovoPc->play();

$lenovoTv = $lenovoFactory->createTv();
$lenovoTv->open();
$lenovoTv->watch();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值