它的里面是一堆工厂方法,每个工厂方法返回某种类型的对象。

比如说工厂可以生产鼠标和键盘。那么抽象工厂的实现类(它的某个具体子类)的对象都可以生产鼠标和键盘,但可能工厂A生产的是罗技的键盘和鼠标,工厂B是微软的。

这样A和B就是工厂,对应于抽象工厂; 每个工厂生产的鼠标和键盘就是产品,对应于工厂方法;

用了工厂方法模式,你替换生成键盘的工厂方法,就可以把键盘从罗技换到微软。但是用了抽象工厂模式,你只要换家工厂,就可以同时替换鼠标和键盘一套。如果你要的产品有几十个,当然用抽象工厂模式一次替换全部最方便(这个工厂会替你用相应的工厂方法)

所以说抽象工厂就像工厂,而工厂方法则像是工厂的一种产品生产线 --------------------------------- “抽象工厂”模式依赖于“工厂方法”模式的。因此,抽象工厂强调的是前面的动词“抽象”,也就是说,你将工厂方法模式中的工厂方法抽象出来的那个"动作或设计"就是“抽象工程”模式了。 --------------------------------- factory method针对的是一个产品等级结构   abstract factory是面向多个产品等级结构的 --------------------------------- 工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。                                一个抽象工厂类,可以派生出多个具体工厂类。                                每个具体工厂类只能创建一个具体产品类的实例。  抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。                                一个抽象工厂类,可以派生出多个具体工厂类。                                每个具体工厂类可以创建多个具体产品类的实例。     区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。       工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。 ---------------------------------    1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了.    2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来.    3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当用抽象工厂,把各种各样的植物,又组成一个后花园. 所以我个人认为,简单工厂是一个工厂只生产一类的产品,面对的是具体的类,工厂方法是可以生产不同的产品,把公共的方法抽象出来,然后进行创建各种各样的产品.抽象工厂把几种产品划出共同的东西,把相互依赖的对象抽象出来,只要实现这些接口就可以得到不同的产品. 具体例子: 1.简单工厂:

using System;
public interface ICar
{ void run();
} public class BMWCar : ICar
{ public void run() { Console.WriteLine("BMWCar run"); }
} public class BenzCar : ICar
{ public void run() { Console.WriteLine("BenzCar run"); }
} public class Driver
{ public static ICar DriverCar(string carType) { switch (carType) { case "BMWCar": return new BMWCar(); case "BenzCar": return new BenzCar(); default: throw new Exception(); } }
} public class Client
{ public static void Main() { ICar myCar = Driver.DriverCar("BenzCar"); myCar.run(); Console.Read(); }
}

心得:优点是只要实现共有的接口就可以实现不同车跑的方式.但缺点就是要判断哪一种车,造成要修改Driver 类
2.工厂方法:

using System;
public interface ICar
{ void run();
} public class BMWCar : ICar
{ public void run() { Console.WriteLine("BMWCar run"); }
} public class BenzCar : ICar
{ public void run() { Console.WriteLine("BenzCar run"); }
}
public abstract class Driver
{ public abstract ICar DriverCar();
} public class BMWDriver : Driver
{ public override ICar   DriverCar() { return new BMWCar(); } }
public class BenzDriver : Driver
{ public   override ICar DriverCar() { return new BenzCar(); }
} class Client
{ public static void Main() { Driver myDriver = new BenzDriver(); ICar myCar = myDriver.DriverCar(); myCar.run(); Console.Read(); }
}

心得:优点是符合了开放-封闭原则(OCP),从整体上还看不出什么缺点.

3.抽象工厂:

using System; public interface IBusinessCar
{ void run();
} public interface ISportCar
{
void run();
} public class BMWBusinessCar : IBusinessCar
{ public void run() { Console.WriteLine("BMWCar run"); }}public class BenzBusinessCar : IBusinessCar
{ public void run() { Console.WriteLine("BenzBusinessCar run"); }
} public class BMWSportCar:ISportCar
{
public void run()
{
Console.WriteLine("BMWSportCar run");
}
} public class BenzSportCar:ISportCar
{
public void run()
{Console.WriteLine("BenzSportCar run");
}
} public interface IDriver
{
IBusinessCar BusinessCarDriver();
ISportCar SportCarDriver();
} public class BMWDriver:IDriver
{
public IBusinessCar BusinessCarDriver()
{
return new BMWBusinessCar();
}
public ISportCar SportCarDriver()
{
return new BMWSportCar();
}
} public class BenzDriver:IDriver
{
public IBusinessCar BusinessCarDriver()
{
return new BenzBusinessCar();
} public ISportCar SportCarDriver()
{
return new BenzSportCar();
}
}class Client
{ public static void Main() { IDriver myDriver =new BenzDriver(); ISportCar myCar = myDriver.SportCarDriver(); myCar.run(); Console.Read(); }}

心得:抽象方法似乎达到了完美境界.把开奔驰的司机和开宝马的司机的公共方法抽象出来,并对不同的司机创建不同的类,到时候不管是开什么车的司机随你添加.它们唯一的共同点都是开车.

转载于:https://www.cnblogs.com/xiaowuzi/p/3388937.html

抽象工廠與工廠方法的區別相关推荐

  1. java中extends怎么用_Java 中extends與implements使用方法

    初學Java語言, 代碼中的extends和implements讓我感到很迷惑,現在終於弄明白它們之間的區別和用法了. //定義一個Runner接口 public inerface Runner { ...

  2. 钟表维修管理系统技术解析 工单派工(三)

    工单派工模块 工单派工是对工单进行维修师傅分配的操作,就是指定某条工单由某个师傅负责维修,派工可以进行修改(更换维修师傅),每一次派工都会生成派工记录.新的单据选择维修师傅后单据的颜色会变成墨绿色,保 ...

  3. sap生产工单报工_SAP作业分割与作业价格计算说明

    作者:吕建伟(阿朱说) 声明:本文章仅代表原作者观点,不代表本微信公众号.仅用于SAP软件的应用与学习,不代表SAP公司.(注:文中所示截图来源SAP软件,相应著作权归SAP所有.) 业务概述:生产制 ...

  4. 云呐工单系统自动完成科学派工和报工支持系统

    客户服务系统是常用的企业信息应用软件,促进企业降低运营成本,有效提高客户留存率,在企业管理中占有举足轻重的作用.工单系统是客户服务系统的核心模块,可实现前.后.后.部门之间的协作.跨企业协作. 对于所 ...

  5. 抽象工厂的缺点和解决方法

    先上干货,后面才是代码例子: 参考<设计模式之禅>的话"抽象工厂模式是工厂方法模式的升级版本".其实就是用工厂方法生产具有多维度变化的产品类.什么是多维度的类?即一个类 ...

  6. java如何开发生产派工报工_派工工序报工

    派工工序报工 应用场景及介绍:用户使用终端设备扫描工序任务快速定位进行报工: HMI操作 [HMI主控台]->[派工工序报工] 操作说明: 条码扫描:默认为空,按照扫描输入的条码,查找工序计划分 ...

  7. php 抽象 接口类 区别,PHP 抽象類和接口區別

    php中抽象類和接口的區別 1) 概念 面向對象的三大概念:封裝,繼承,多態 把屬性和方法封裝起來就是類. 一個類的屬性和方法被另外的類復制就是繼承,PHP里面的任何類都可以被繼承,被繼承的屬性和方法 ...

  8. mysql memcache redis_redis,mysql,memcache的區別與比較,redis兩種數據存儲持久化方式

    redis與mysql比較 區別:mysql中一個中小型的網絡數據庫,比oracle和sqlserver小, 但是並發能力遠超過acess這樣的桌面數據庫:redis是一個內存鍵值數據庫,支持網絡.可 ...

  9. 鏡頭上的 F 與 f 之區別

    http://zip.nvp.com.tw/forum.php?mod=viewthread&tid=603&extra=page%3D2 鏡頭上的 F 與 f 之區別: ‧ F 代表 ...

最新文章

  1. 青少年编程竞赛交流群第050次活动录播
  2. reactor线程模型_从TCP服务器到I/O模型,带你学习Netty
  3. 2019 .NET China Conf:路一直都在,社区会更好
  4. PVS 6.1 Configuring Services Failed
  5. P2386 放苹果 方法一
  6. 【Level 08】U08 Positive Attitude L5 Satisfy your need to know
  7. OpenShift 之 Quarkus(4)用集成的Prometheus监控Quarkus应用
  8. java 将小数度数转换为度分秒格式
  9. 来到ThoughtWorks
  10. bt种子简介与magnet磁力介绍
  11. 修改.class文件内容
  12. 基于JavaEE的网吧自动计费管理系统设计与实现_信息管理__JSP网站设计_SQLServer数据库设计
  13. Android:获取当前的锁屏壁纸或桌面壁纸
  14. 四位企业家 一种“地头力”
  15. 键盘调节台式计算机声音,台式电脑如何用键盘控制声音开关
  16. 《两日算法系列》之第四篇:隐马尔可夫模型HMM
  17. 【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细)
  18. android 下 ftp 客户端软件编写(ftp4j)
  19. 关于Trunk封装的协议和模式。如何配置trunk
  20. 前后端分离:vue项目部署服务器操作步骤详细

热门文章

  1. Mac下使用crontab来实现定时任务
  2. 激光打标软件_走向工业自动化生产之路——激光飞行打标
  3. python实现excel数据透视表_用python建立excel的数据透视表
  4. 在docker中haproxy的安装以及mysql的负载均衡配置
  5. oracle Router,Oracle官方轻量级中间件MySQL Router介绍与性能测试
  6. 100连接蓝牙_车机蓝牙连接常见问题说明
  7. 线段树 ---- 线段树上区间二分 或者单点二分 codeforces C. Greedy Shopping
  8. bzoj异或之[查询异或和的第k小]
  9. python建立文件数据库_Python创建CRNN训练用的LMDB数据库文件
  10. 33.搜索旋转排序数组