zoukankan      html  css  js  c++  java
  • 11种常用设计模式之工厂模式

    1)简单工厂模式(Simple Factory)

     

    2)工厂方法模式(Factory Method)

     

    3)抽象工厂模式(Abstract Factory)

     
     
    简单工厂模式 Simple Factory

    简单工厂模式又称静态工厂方法,它属于类创建模式。在简单工厂模式中,可以根据自变量的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。
     
    简单工厂模式的角色
    1.工厂类(Creator),工厂模式的核心,含有与应用业务逻辑处理的代码。
    2.抽象产品(Abstract Product),被工厂创建实例的父类或拥有的共同接口。
    3.具体产品(Concrete Product),任何被工厂创建的对象都是它的实例。
     
    简单工厂的优点:
    1.工厂类可以根据不同的参数创建不同的产品的实例,客户端可以免除直接创建产品。
    2.创建产品实例的方法唯一,减少使用者的记忆。
    3.通过配置文件,可以不修改任何客户端代码,即可实现更换和新增具体产品。
     
    简单工厂的缺点:
    1.由于工厂类集中了所有的产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
    2.使用简单工厂模式,会增加类的数量,在一定程度上增加系统的复杂度。
    3.简单工厂模式使用了静态的工厂方法,造成工厂角色无法形成基于继承的等级结构。
     
    php示例代码:
     1 <?php
     2  
     3 $vehicle = Factory::create("plane");
     4 $vehicle->run();
     5  
     6  
     7 abstract class vehicle{
     8     abstract function run();
     9 }
    10  
    11 class Car extends vehicle{
    12  
    13     public function run(){
    14         print("汽车在路上行驶");
    15     }
    16 }
    17  
    18 class Plane extends vehicle{
    19  
    20     public function run(){
    21         print("飞机在天空翱翔");
    22     }
    23 }
    24  
    25 class Factory{
    26  
    27     public static function create($class){
    28         $class = ucfirst($class);
    29         $vehicle =  new $class();
    30         return $vehicle;
    31     }
    32 }
     
    简单工厂适用环境
    1.工厂负责类比较少
    2.客户端只知道传入参数,对于如何创建对象不关心
     
     
    工厂方法Factory Method
     
    简单的工厂模式一旦程序出现问题,整个系统都无法正常工作,为了降低风险和维护难度,对其重构,所以引入工厂方法。工厂方法为工厂类定义了接口,用多态来削弱工厂类的职能。
     
    相比简单工厂多了一个抽象工厂角色,它是与应用程序无关的,任何在模式中创建对象的工厂类必须实现这个接口。
     
    工厂方法优点:
    相比简单工厂模式,用户关心的是对应的工厂,在添加新的产品时,无需修改抽象工厂和抽象产品提供的接口,只需要实现一个具体的工厂和具体产品就可以了。
    工厂方法缺点:
    1.在添加新的产品时,需要添加两个类。
    2.增加系统抽象性和理解难度。
     
    适用环境:
    一个类不知道它所需要的对象类,一个类通过其子类来指定哪个对象,将创建对象的任务委托给多个工厂子类中的某个类。
     
    PHP示例代码:
     1 <?php
     2 $factory = new CarFactory();
     3 $vehicle = $factory->create();
     4 $vehicle->run();
     5  
     6 abstract class vehicle{
     7     abstract function run();
     8 }
     9  
    10 class Car extends vehicle{
    11  
    12     public function run(){
    13         print("汽车在路上行驶");
    14     }
    15 }
    16  
    17 class Plane extends vehicle{
    18  
    19     public function run(){
    20         print("飞机在天空翱翔");
    21     }
    22 }
    23 abstract class Factory{
    24     abstract function create();
    25 }
    26  
    27 class CarFactory extends Factory{
    28  
    29     public function create(){
    30         $vehicle =  new Car();
    31         return $vehicle;
    32     }
    33 }
    34  
    35 class PlaneFactory extends Factory{
    36  
    37     public function create(){
    38         $vehicle =  new Plane();
    39         return $vehicle;
    40     }
    41 }
    抽象工厂模式,下次再续。。。
     
  • 相关阅读:
    JDK源码那些事儿之LinkedBlockingQueue
    JDK源码那些事儿之并发ConcurrentHashMap上篇
    JDK源码那些事儿之ArrayBlockingQueue
    JDK源码那些事儿之HashMap.TreeNode
    mycat使用schema配置
    redis连接数高居不下,怎么破?。。。。这么破
    修改tomcat使用的的编码方式
    centos6.x下让redis以服务方式运行
    mycatrule
    HTML和XML中的转义字符
  • 原文地址:https://www.cnblogs.com/helingfeng/p/5793877.html
Copyright © 2011-2022 走看看