本帖最后由 大蓝鲸小蟀锅 于 2018-7-13 10:30 编辑
什么是工厂模式
工厂模式 :
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
简单的来说在不用工厂模式之前 我们获得一个对象的方法就是自己new一个实例出来 用了工厂模式以后new对象的动作由工厂来做 我们每次需要这个对象实例的时候 就去跟工厂要
工厂模式一共有三种: 分别是简单工厂 , 工厂方法 ,抽象工厂
下面举个例子分别说明
第一章大马的作坊(简单工厂) 大马有一手木工手艺,活好,尤其是床做得好!打败了临近村庄的所有木匠(如何打败请自行脑补)。于是他决定创建一个木工作室接活做床!取名大马家具工作室(逼格挺高)。 大马家具工作室工作内容如下:承接各种风格的床(日本,欧美,非洲草原风等等) 开业第一天隔壁老王来定做一套日本风的床,于是大马给老王做了一套。 第二天邻村老李来定做一套欧美田园风床,于是大马又接了此活。 。。。。。 此处代码可以这么写: //大马的作坊 public class DaMaFactory{ public Bedproduct(String type){ if("日式".equles(type)){ returnnew JapanBed(); }elseif("美式".equles(type)){ returnnew AmericanBed (); }else{ returnnull; } } } //大马的产品-床的抽象 public interface Bed{ StringgetType(); } //大马的具体产品-日式床 public class JapanBed implements Bed{ public StringgetType(){ return"我是日式床"; } } //大马的具体产品-美式床 public class AmericanBed implements Bed{ public StringgetType(){ return"我是美式床"; } } 对简单工厂模式的说明: 1. 首先,使用了简单工厂模式后,我们的程序不在"有病",更加符合现实中的情况;而且客户端免除了直接创建产品对象的责任,而仅仅负责"消费"产品 2. 下 面我们从开闭原则上来分析下简单工厂模式。当增加了一种床的时候,只要符合抽象产品制定的合同,那么只要通知工厂类知道就可以被客户使用了。那么对 于产品部分来说,它是符合开闭原则的--对扩展开放、对修改关闭;但是工厂部分好像不太理想,因为每增加一种风格,都要在工厂类中增加相应的逻辑和判断逻辑,这显自然是违背开闭原则的。 第二章大马床业集团(工厂方法) 一转眼三年过去了,由于活好,大马成了当地的土豪。一天晚上,大马跪着和他媳妇商量,咱钱也有了是不是考虑扩大规模,再赚他个一个亿。我也干累了,以后想搞搞设计,搞搞管理,接接业务,至于做床的活就交给我的两个好徒弟奔波儿灞,霸波尔奔。 此处介绍一下大马的徒弟: 奔波儿灞-擅长制作日式床。 霸波尔奔-擅长制作美式床。 说干就干,第二天大马就注册了大马床业集团,以及子公司:岛国风情床业(由大徒弟奔波儿灞制作日式床),欧美风情床业两家子公司(二徒弟霸波尔奔制作美式床)。 一个月的准备后,大马床业集团正式营业,主要经营方式:由大马的公司本部接单,根据订单将日式床业务转交大徒弟公司做,美式床业务转交二徒弟做。 具体代码实现如下: //大马床业集团 public interface DaMaFactory{ Bedproduct(); } //岛国风情床业 public interface DGFQFactory implements DaMaFactory{ public Bedproduct(){ returnnew JapanBed(); } } //欧美风情床业 public interface OMFQFactory implements DaMaFactory{ public Bedproduct(){ returnnew AmericanBed(); } } //大马的产品-床的抽象 public interface Bed{ StringgetType(); } //大马的具体产品-日式床 public class JapanBed implements Bed{ public StringgetType(){ return"我是日式床"; } } //大马的具体产品-美式床 public class AmericanBed implements Bed{ public StringgetType(){ return"我是美式床"; } } 工厂方法模式的说明: 1. 工厂方法使用一个抽象工厂角色作为核心来代替在简单工厂模式中使用具体类作为核心。让我们来看看工厂方法模式给我们带来了什么?使用 开闭原则来分析下工厂方法模式。当有新的产品产生时,只要增加一个接口继承大马床业集团不必在修改源代码,工厂方法模式是完全符合开闭原则的! 2. 使用工厂方法模式足以应付我们可 能遇到的大部分业务需求。但是当产品种类非常多时,就会出现大量的与之对应的工厂类,这不应该是我们所希望的。 3. 当然特殊的情况,就要特殊对待了:对于系统中存在不同的产品树,而且产品树上存在产品族(不仅仅是床 还有其他的产品),那么这种情况下就可能可以使用抽象工厂模式了。 第三章大马家居(抽象工厂) 距大马床业集团的创建已过去十年,大马床业集团已成为A省龙头企业,旗下公司十好几个。大马床业集团在三年前已更名大马家居,经营业务也不光生产床,还生产座椅板凳等等其他家具。大马大徒弟和二徒弟的公司数度转型,已不再只经营床的生产,还生产公司的其他家具,但是两人还是保持各自风格,只生产最初的风格的家具。 此时大马家居的主要经营方式为:由公司总部接订单(不同风格座椅板凳和床),再由公司总部将对应风格的订单下发到子公司,进行生产加工。 具体代码实现如下: //大马床业集团 public interface DaMaFactory{ BedproductBed(); TableproductTable(); } //岛国风情床业 public interface DGFQFactory implements DaMaFactory{ public BedproductBed(){ returnnew JapanBed(); } public TableproductTable(){ returnnew JapanTable(); } } //欧美风情床业 public interface OMFQFactory implements DaMaFactory{ public BedproductBed(){ returnnew AmericanBed(); } public TableproductTable(){ returnnew AmericanTable(); } } //大马的产品-床的抽象 public interface Bed{ StringgetBedType(); } //大马的具体产品-日式床 public class JapanBed implements Bed{ public StringgetBedType(){ return"我是日式床"; } } //大马的具体产品-美式床 public class AmericanBed implements Bed{ public StringgetBedType(){ return"我是美式床"; } } //大马的产品-桌子的抽象 public interface Table{ StringgetTableType(); } //大马的具体产品-日式桌子 public class JapanTable implements Table{ public StringgetTableType(){ return"我是日式桌子"; } } //大马的具体产品-美式桌子 public class AmericanTable implements Table{ public StringgetTableType(){ return"我是美式桌子"; } } 抽象工厂模式的优点 抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。 抽象工厂模式的缺点 产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。 |