设计模式 简单工厂+工厂方法+抽象工厂

简单工厂

简单工厂的优缺点:

缺点:①违反了OCP(开放-封闭原则)。(当工厂内增加一个方法创建对象时候,需要在原来的工厂内,添加一个case语句)。修改原来的类,是违反设计原则的。

②增加客户端和工厂类的耦合。

优点:①去除(非降低)客户端和具体产品的耦合。客户端和具体产品中间增加一个工厂类,增加客户端和工厂类的耦合。

   ②封装工厂类,实现代码多平台的复用性。创建对象的过程被封装成工厂类,可以多平台(控制台+WEB+Winform...手机端)调用这个工厂。

   ③封装工厂类,创建对象的过程(具体逻辑)包含必要的逻辑,根据客户端的要求,我们可以动态的去创建对象。比如用反射或者new的方式来创建。

“产品”类

 public class PersonClass
   {
      public string Name { get; set; }
      public double Height { get; set; }
   }
   class WhitePerClass : PersonClass
   {
   }
   class BlackPerClass : PersonClass
   {
   }
   class YellowPerClass : PersonClass
   {
   }

“工厂”类:

 public static class ClassFactory
  {
    public static PersonClass CreateObject(string str)
    {
      PersonClass perClass = null;
      //也可以用反射等逻辑来创建对象。客户端调用时,是管不到我怎么样创建对象的。这是封装的好处之一。
      switch (str)
      {
        case "white":
          perClass = new WhitePerClass();
          break;
        case "black":
          perClass = new BlackPerClass();
          break;
        case "yellow":
          perClass = new YellowPerClass();
          break;
      }
      return perClass;
    }
  }
}

“客户端”:

 static void Main(string[] args)
      {
         //PersonClass perWhite = new WhitePerClass();//虽然“产品”类PersonClass,采用了面向高层的方法,不用工厂创建对象,还是有一定的耦合。
         PersonClass perClass = null;
         perClass = ClassFactory.CreateObject("white");
         perClass.Name = "小白";
         perClass.Height = 1.7;
         Console.WriteLine(perClass.Name + perClass.Height);
         perClass = ClassFactory.CreateObject("black");
         perClass.Name = "小黑";
         perClass.Height = 2.1;
         Console.WriteLine(perClass.Name + perClass.Height);
         perClass = ClassFactory.CreateObject("yellow");
         perClass.Name = "小黄";
         perClass.Height = 1.8;
         Console.WriteLine(perClass.Name + perClass.Height);
         Console.Read();
      }

结果:

再述简单工厂:

产品本身采用了多态。可以new一个产品出来,这样本身降低了客户端和“产品”的耦合,但是未去除耦合。由工厂进一步去除耦合。

缺点:当增加一个产品时,需要在工厂添加一个case语句,修改了原来工厂类。违反了OCP开放封闭原则。

总结简单工厂:

给工厂传一个字符串,返回一个对象。创建逻辑各式各样。

产品树(产品等级)+产品族

都是指的产品。根据品牌和生产厂家分类。

产品树(产品等级):针对产品。指一个产品:品牌不同。

①车(产品):宝马车,奥迪车,奥拓车。

②数据库(产品):MS-SQL,ORACLE,ACCESS,DB2,MongoDB

产品族:针对工厂。一个工厂,产各种产品,各种产品统称一“族”。

①宝马(工厂)生产:宝马自行车,宝马三轮车0.0,宝马的其他产品,衣服,鞋子,宝箱等等。都是一族

②MS-SQL(工厂)生产: user表,department表,role表

工厂方法

特点:只处理一个产品树。可以理解为,只对一张表处理。也是和下面的抽象工厂区别的地方

优点:就是解决简单工厂的缺点(违反了OCP)。和抽象工厂一样,提高程序的扩展性,可以改数据库。增加对应数据库工厂。

缺点:不能增加一个“产品”,只能增加一个工厂,实现了换数据库的功能。但只能处理一个表。若增加一个表就是抽象工厂了。

类图:

个人总结:我们平时用到了工厂模式,一般属于简单工厂或者抽象工厂,因为可以对多个表处理。

抽象工厂:

优点:去除了简单工厂的违反OCP原则,通过添加子类,而不是改变原来类。来增加”产品“。

缺点:每增加一个产品:需要添加一个产品接口+sql产品+oracle产品,还要增加工厂接口+sql工厂+oracle工厂的一个方法。

“产品“类

用户:

  interface IUserDal
  {
    void CRUD();
  }
  class SqlUserDal : IUserDal
  {
    public void CRUD()
    {
      Console.WriteLine("sql数据库User的CRUD");
    }
  }
  class OracleUserDal : IUserDal
  {
    public void CRUD()
    {
      Console.WriteLine("Oracle数据库User的CRUD");
    }
  }

部门:

interface IDepartmentDal
  {
    void CRUD();
  }
  class SqlDepartmentDal :  IDepartmentDal
  {
    public void CRUD()
    {
      Console.WriteLine("sql数据库Department的CRUD");
    }
  }
  class OracleDepartmentDal : IDepartmentDal
  {
    public void CRUD()
    {
      Console.WriteLine("Oracle数据库Department的CRUD");
    }
  }

”工厂“类

  interface IFactory
  {
    IUserDal CreateUserDal();
    IDepartmentDal CreateDepartmentDal();
  }
  class SqlFactory : IFactory
  {
    public IUserDal CreateUserDal()
    {
      return new SqlUserDal();
    }
    public IDepartmentDal CreateDepartmentDal()
    {
      return new SqlDepartmentDal();
    }
  }
  class OracleFactory : IFactory
  {
    public IUserDal CreateUserDal()
    {
      return new OracleUserDal();
    }
    public IDepartmentDal CreateDepartmentDal()
    {
      return new OracleDepartmentDal();
    }
  }

客户端:

      static void Main(string[] args)
      {
         //创建Sql对应dal
         SqlFactory sqlFactory=new SqlFactory();
         IUserDal sqlUserDal = sqlFactory.CreateUserDal();
         sqlUserDal.CRUD();
         IDepartmentDal sqlDeparmentDal = sqlFactory.CreateDepartmentDal();
         sqlDeparmentDal.CRUD();

         //换数据库了,需要创建Oracle对应Dal
         OracleFactory oracleFactory = new OracleFactory();
         IUserDal oracleUserDal = oracleFactory.CreateUserDal();
         oracleUserDal.CRUD();
         IDepartmentDal oracleDeparmentDal = oracleFactory.CreateDepartmentDal();
         oracleDeparmentDal.CRUD();
         Console.Read();
      }

结果:

总结:

①理解产品族和产品树(产品等级),方便记忆类图。

②知道工厂方法和抽象工厂的区别

③工厂方法和抽象工厂改善了简单工厂的缺点(违反ocp),带来的缺点是什么。

为了改变抽象工厂增加一个”产品“,带来的繁琐代码,你想到怎么改进了吗?

时间: 2024-10-11 12:36:21

设计模式 简单工厂+工厂方法+抽象工厂的相关文章

详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)

园子里关于23种设计模式的博文已经可以说是成千上万.车载斗量.屯街塞巷.不计其数.数不胜数.摩肩接踵.汗牛充栋.车水马龙.门庭若市.琳琅满目直至让人眼花缭乱了.在这样的大环境下之所以来写设计模式类的博文,并不是像一些"非主流"的爱情观那样"宁缺毋滥". 只是其一呢,因为相当于给自己做一个总结,加深一下自己这方面的认识,因为掌握了和把它写出来我感觉后者还可以对技能有一个提升,其二呢是因为最近公司有一个内部的training需要讲设计模式. v写在前面 在这里呢,需要向

23种设计模式(3):抽象工厂模式

定义:为创建一组相关或相互依赖的对象提供一个接口,并且无需指定他们的详细类. 类型:创建类模式 类图: 抽象工厂模式与工厂方法模式的差别 抽象工厂模式是工厂方法模式的升级版本号,他用来创建一组相关或者相互依赖的对象.他与工厂方法模式的差别就在于,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式则是针对的多个产品等级结构.在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的全部产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类

设计模式【3】:抽象工厂

在网上看到一篇总结的比较好的文章,就借鉴下来共享: 定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 类型:创建类模式 类图: 抽象工厂模式与工厂方法模式的区别 抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象.他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式则是针对的多个产品等级结构.在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽

一起来学设计模式-----创建型模式之抽象工厂

学习了简单工厂,工厂方法模式,那什么是抽象工厂呢?工厂方法模式是在超类(IFactory)中定义一个工厂的抽象接口(CreateOperation),然后由子类负责创建具体对象:而抽象工厂则是维护一个产品家族,由子类定义产品被产生的方法,客户根据超类的接口开发.目前简单的理解,抽象工厂更多的就是基于多种产品的抽象和对象的创建. 假设系统里有一个用户表,需求是插入和选择用户时根据用户的需求,可以保存在mysql 数据库或者Access数据库中,这时用工厂方法模式应该怎么样实现呢? 首先使用面向对象

创建和使用解耦——工厂模式详解(工厂方法+抽象工厂)

1.前言 直接new一个对象是最简单的创建对象的方式,但大量出现在业务代码中会带来至少两个问题.1:创建对象的细节直接暴露在业务代码中,修改实现细节必须修改相关的大量客户端代码.2:直接面向具体类型编程,违反了面向接口编程的原则,系统进行扩展时也不得不进行大量修改.要使得系统具有的良好的可扩展性以及后期易于维护,必须实现对产品的获取和对产品的使用解耦.要做到这两点,首先要对客户端代码屏蔽掉创建产品的细节,其次,客户端必须面向产品的抽象编程,利用java的多态特性在运行时才确定具体的产品.而这,正

【C#设计模式——创建型模式】抽象工厂模式

抽象工厂模式比工厂模式具有更高层次的抽象性.当要返回一系列相关类中的某一个,而每个类都能根据需要返回不同的对象时,可以选择这种模式.直接进入示例. 示例描述:完成花园的规划,多种花园种类,每个里面多种植物 编写一个基类Garden,Garden就是抽象工厂.它定义了具体类中的方法,并返回一系列相关类中的某个类. public class Garden { protected Plant center, shade, border; protected bool showCenter, showS

2 简单工厂模式、工厂模式、抽象工厂模式

简单工厂模式: -----------------------------------Pizza.java-------------------- package com; public abstract class Pizza { public abstract void prepare(); public abstract void bake(); public abstract void cut(); } -----------------------------------APizza.

易学设计模式看书笔记(4) - 抽象工厂模式

 本文内容来自书上,不懂设计模式,只求混个眼熟. 三.抽象工厂模式 1.动物管理系统的例子 public interface Animal{ public void eat(); } public class Tiger implements Animal { public void eat(){ sysout.out.println("老虎会吃"); }; public void run(){ sysout.out.println("老虎会跑"); }; } pu

设计模式01 创建型模式 - 抽象工厂

参考 1. 三种工厂模式的分析以及C++实现|博客园 2. 设计模式之三:抽象工厂模式 | CSDN 3. 浅谈Java设计模式--单实例.简单工厂.抽象工厂.观察者 | CSDN 抽象工厂 为创建一组相关或者相互依赖的对象提供一个接口,而无需指定他们具体的类. 通俗讲,就是创建工厂的工厂,每个工厂都实现抽象工厂,从而决定一个产品族:不同工厂生产不同产品族. 抽象工厂只关心接口,也就是工厂和产品之间的关系,工厂和用户之间的关系,而不关心产品如何实现,而Template和Builder Patte

深入理解设计模式(五):抽象工厂模式

接着上一次的工厂方法模式讲. 假设目前你的程序里面有三个对象IphoneX.IphoneXs.IphoneXR的尺寸,那么你使用工厂模式就已经足够了,因为她们属于同一个品类,都属于苹果,如果在添加一个IPhone2019产品,也只需要把IPhone2019加入到你的苹果工厂里面就够了. 但是如果你程序里面还需要知道华为mate10或者小米8的尺寸.这时候你怎么来创建这些对象呢?这时候工厂模式明显已经不适用了,因为工厂模式是对象都实现了同一个接口,这时候就可以使用抽象工厂模式了. 一.什么是抽象工