zoukankan      html  css  js  c++  java
  • 学习笔记:工厂方法模式及简单工厂模式的对比

    笔记来源《深入浅出设计模式(中文版)》。

    工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

    • 工厂方法模式的概念
      工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。
      你应该大致猜出了工厂方法模式的结构,来看下它的组成:
      1) 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java 中它由抽象类或者接口来实现。
      2) 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
      3) 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在 java 中一般有抽象类或者接口来实现。
      4) 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在 java 中由具体的类来实现。
    • 结合实例代码理解
      • 实例:

        话说十年前,有一个暴发户,他家有三辆汽车——Benz 奔驰、Bmw 宝马、Audi 奥迪,还雇了司机为他开车。不过,暴发户坐车时总是怪怪的:上Benz 车后跟司机说“开奔驰车!”,
        坐上Bmw 后他说“开宝马车!”,坐上Audi 说“开奥迪车!”。我们以工厂模式来改造暴发户坐车的方式——现在暴发户只需要坐在车里对司机说句:“开车”就可以了。

     1 //抽象工厂角色
     2     public interface ICar     
     3     {
     4         void Drive();
     5     }
     6     class BenchiCar:ICar
     7     {
     8         public void Drive()
     9         {
    10             Console.WriteLine("Driving BenchiCar");
    11         }
    12     }
    13     class BmwCar : ICar
    14     {
    15         public void Drive()
    16         {
    17             Console.WriteLine("Driving BMW Car");
    18         }
    19     }
    20     #region 工厂方法模式
    21     public interface IDriver
    22     {
    23         ICar DiverCar();
    24     }
    25     public class BenchiDriver : IDriver
    26     {
    27         public ICar DiverCar()
    28         {
    29             return new BenchiCar();
    30         }
    31     }
    32     public class BmwDriver : IDriver
    33     {
    34         public ICar DiverCar()
    35         {
    36             return new BmwCar();
    37         }
    38     }
    39 
    40     #endregion
    View Code
      • 客户端实现代码如下
    1 Driver driver = new BenzDriver();
    2 Car car = driver.driverCar();
    3 car.drive();
    View Code
    • 同例用简单工厂模式实现的代码如下
     1 //抽象工厂角色
     2     public interface ICar     
     3     {
     4         void Drive();
     5     }
     6     class BenchiCar:ICar
     7     {
     8         public void Drive()
     9         {
    10             Console.WriteLine("Driving BenchiCar");
    11         }
    12     }
    13     class BmwCar : ICar
    14     {
    15         public void Drive()
    16         {
    17             Console.WriteLine("Driving BMW Car");
    18         }
    19     }
    20     #region 简单工厂模式
    21     class CarFactory
    22     {
    23         public static ICar CreateICar(string carType)
    24         {
    25             if (carType.Substring(0, 3).ToUpper() == "BEN")//暂时处理方法
    26             {
    27                 return new BenchiCar();
    28             }
    29             else
    30             {
    31                 return new BmwCar();
    32             }
    33         }
    34     }
    35     #endregion
    View Code
      • 客户端实现代码
    1 Car car = Driver.driverCar("benchi");
    2 car.drive();
    View Code
  • 相关阅读:
    android xml解析添加到listview中的问题
    jquery重写一个对话框
    linq join多字段
    asp.net添加验证码
    基本知识点罗列
    wordpress添加文章浏览统计(刷新不重复)
    vue使用SockJS实现webSocket通信
    el-table的多选框表头增加全选字样
    js如何在一个日期上面加上几小时 几分钟 几秒
    高德地图-Vue-amap实现POI搜索+自定义点
  • 原文地址:https://www.cnblogs.com/-------perfect/p/3473149.html
Copyright © 2011-2022 走看看