工厂模式总结(4400字)

来源:m.ttfanwen.com时间:2016.12.24

一、引子

话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰)、Bmw(宝马)、Audi(奥迪)看来这人比较爱国,没有日本车),还雇了司机为他开车。不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!",坐上Bmw后他说"开宝马车!",坐上Audi后他说"开奥迪车!"。你一定说:这人有病!直接说开车不就行了?! 而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!幸运的是,这种有病的现象在OO语言中可以避免了。下面以Java语言为基础来引入我们本文的主题:工厂模式!!

二、简介

工厂模式主要是为创建对象提供了接口。工厂模式按照《Java与模式》中的提法分为三类:

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

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

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

这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。下面是使用工厂模式的两种情况:

1.在编码时不能预见需要创建哪种类的实例。

2.系统不应依赖于产品类实例如何被创建、组合和表达的细节

三、简单工厂模式

顾名思义,这个模式本身很简单,而且使用在业务较简单的情况下。

它由三种角色组成(关系见下面的类图):

1、工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。

2、抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。

3、具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

那么简单工厂模式怎么用呢?我来举个例子吧,我想这个比讲一大段理论上的文字描述要容易理解的多!下面就来给那个暴发户治病: P

在使用了简单工厂模式后,现在暴发户只需要坐在车里对司机说句:"开车"就可以了。来看看怎么实现的:

//抽象产品角色

public interface Car{

public void drive();

}

//具体产品角色

public class Benz implements Car{

public void drive() {

System.out.println("Driving Benz ");

}

}

public class Bmw implements Car{

public void drive() {

System.out.println("Driving Bmw ");

}

}

。。。(奥迪我就不写了:P)

//工厂类角色

public class Driver{

//工厂方法

//注意 返回类型为抽象产品角色

public static Car driverCar(String s)throws Exception {

//判断逻辑,返回具体的产品角色给Client

if(s.equalsIgnoreCase("Benz")) return new Benz();

else if(s.equalsIgnoreCase("Bmw"))

return new Bmw();

......

else throw new Exception();

。。。

//欢迎暴发户出场......

public class Magnate{

public static void main(String[] args){

try{

//告诉司机我今天坐奔驰

Car car = Driver.driverCar("benz");

//下命令:开车

car.drive();

。。。

如果将所有的类放在一个文件中,请不要忘记只能有一个类被声明为public。 程序中类之间的关系如下:

这便是简单工厂模式了。下面是其好处:

首先,使用了简单工厂模式后,我们的程序不在"有病",更加符合现实中的情况;而且客户端免除了直接创建产品对象的责任,而仅仅负责"消费"产品(正如暴发户所为)。

下面我们从开闭原则上来分析下简单工厂模式。当暴发户增加了一辆车的时候,只要符合抽象产品制定的合同,那么只要通知工厂类知道就可以被客户使用了。那么对于产品部分来说,它是符合开闭原则的--对扩展开放、对修改关闭;但是工厂部分好像不太理想,因为每增加一辆车,都要在工厂类中增加相应的商业逻辑和判断逻辑,这显自然是违背开闭原则的。 对于这样的工厂类(在我们的例子中是为司机师傅),我们称它为全能类或者上帝类。 我们举的例子是最简单的情况,而在实际应用中,很可能产品是一个多层次的树状结构。由于简单工厂模式中只有一个工厂类来对应这些产品,所以这可能会把我们的上帝类坏了,进而累坏了我们可爱的程序员:(

正如我前面提到的简单工厂模式适用于业务将简单的情况下。而对于复杂的业务环境可能不太适应阿。这就应该由工厂方法模式来出场了!!

四、工厂方法模式

先来看下它的组成吧:

1、抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

2、具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。

3、抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

4、具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

来用类图来清晰的表示下的它们之间的关系:

我们还是老规矩使用一个完整的例子来看看工厂模式各个角色之间是如何来协调的。话说暴发户生意越做越大,自己的爱车也越来越多。这可苦了那位司机师傅了,什么车它都要记得,维护,都要经过他来使用!于是暴发户同情他说:看你跟我这么多年的份上,以后你不用这么辛苦了,我给你分配几个人手,你只管管好他们就行了!于是,工厂方法模式的管理出现了。代码如下:

//抽象产品角色,具体产品角色与简单工厂模式类似,只是变得复杂了些,这里略。 //抽象工厂角色

public interface Driver{

public Car driverCar();

}

public class BenzDriver implements Driver{

public Car driverCar(){

return new Benz();

}

}

public class BmwDriver implements Driver{

public Car driverCar() {

return new Bmw();

}

}

......//应该和具体产品形成对应关系,这里略...

//有请暴发户先生

public class Magnate

{

public static void main(String[] args)

{

try{

Driver driver = new BenzDriver();

Car car = driver.driverCar();

car.drive();

}catch(Exception e)

{ }

}

}

工厂方法使用一个抽象工厂角色作为核心来代替在简单工厂模式中使用具体类作为核心。让我们来看看工厂方法模式给我们带来了什么?使用开闭原则来分析下工厂方法模式。当有新的产品(即暴发户的汽车)产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代码。看来,工厂方法模式是完全符合开闭原则的!

使用工厂方法模式足以应付我们可能遇到的大部分业务需求。但是当产品种类非常多时,就会出现大量的与之对应的工厂类,这不应该是我们所希望的。所以我建议在这种情况下使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实现。

当然特殊的情况,就要特殊对待了:对于系统中存在不同的产品树,而且产品树上存在产品族,那么这种情况下就可能可以使用抽象工厂模式了。

五、小结

让我们来看看简单工厂模式、工厂方法模式给我们的启迪:

如果不使用工厂模式来实现我们的例子,也许代码会减少很多--只需要实现已有的车,不使用多态。但是在可维护性上,可扩展性上是非常差的(你可以想象一下,添加一辆车后要牵动的类)。因此为了提高扩展性和维护性,多写些代码是值得的。

六、抽象工厂模式

先来认识下什么是产品族:位于不同产品等级结构中,功能相关联的产品组成的家族。如果光看这句话就能清楚的理解这个概念,我不得不佩服你啊。还是让我们用一个例子来形象地说明一下吧。

图中的BmwCar和BenzCar就是两个产品树(产品层次结构);而如图所示的

BenzSportsCar和BmwSportsCar就是一个产品族。他们都可以放到跑车家族中,因此功能有所关联。同理BmwBussinessCar和BenzSportsCar也是一个产品族。

回到抽象产品模式的话题上,可以这么说,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。而且使用抽象工厂模式还要满足一下条件:

1.系统中有多个产品族,而系统一次只可能消费其中一族产品

2.同属于同一个产品族的产品一起使用时。

来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):

抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。

抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

看过了前两个模式,对这个模式各个角色之间的协调情况应该心里有个数了,我就不举具体的例子了。只是一定要注意满足使用抽象工厂模式的条件哦,不然即使存在了多个产品树,也存在产品族,但是不能使用的。


第二篇:工厂实训总结 1100字

为期三周的模拟工厂实训转眼就结束了,虽然三周的实训时间很短,但在老师的指导下我学到了很多知识,得到了很多收获。

在模拟工厂,我见到了一些现代化的设备和器材,这些很少见到的大型服装生产设备,让自己的阅历增长了很多。很荣幸的是,自己参与并亲自操作了一些系统。以前只能在书上和网上看到的东西,现在都能亲身感受。在这训中,我学到了平时在课堂学不到的知识。比如:编制生产制造单、接单报价、制造工业样板和样衣的制做、封样,服装厂的设计,服装生产的工艺流程,排料方案的定制;服装悬挂系统的构成原理及操作方法;自动裁床的构造原理制作方法及裁剪;分包、捆扎等。在短短的实训中,我除了学会了对机械的基本操作外,还了解了“流水线”到底是怎样运作的,更重要的是学会了对生产流水线上如何进行人员调配,如何使各个工位运转正常,井然有序,加强了对服装工厂运作模式的认识。

我们在成衣制作的实际操作过程中,出现了许多不专业的操作上的错误,让我看到了理论与实践的断层,更加注意学习平时不会注意的细节。这次实训给我感触最深的是团队精神,在生产流水线上作业,每道工序都是环环相扣的,所以每个工序的成员都必须抱着对每道工序认真负责的态度,认真操作。也让我明白一个道理,看到了学校以及外面更加实际的一面,任何事物都比想象中要困难和复杂的多。通过实训我知道不能只扎到书本里面死学习,活学活用灵活掌握,全面提高自己的综合素质。

在这次为期三周的实训中我学到了很多,我学会了对工作的态度——要认真负责,持之以恒;也学会了团结——团结的集体才是最好的集体;也发现了自己的缺点——不够细心,应付了事。对于所学的专业,我曾经迷茫过,两年来我学到了什么呢?经过这次生产实训,让我找到了自信,因为这两年我不光学到了课本上的知识,也让我通过实训学到了实践,这两年我学了很多,我不用自卑,因我们学到了知识,学会了理论与实践的结合。这次生产实训也告诉我们,我们要绝对有信心,相信自己,一定可以。而大家也一样,一定可以的,未来是我们的。这样的实训课让全班同学都参与进来了,班级同学在一起实训,增进了同学间的感情,使我们班更团结了,这也是这次实训中我们班的集体收获。实训对自己的交际能力,考虑问题的思维方式,对工厂的认识有了进一步提高,从中也认识到就业的严峻性及自己能力的局限性。

实训课程结束了,虽然很忙碌,但是我很高兴,这次让我对实训有了更深刻的认识。也让我们在市场不景气的毕业前夕重新树立了正确学习的目标,坚定了我们的信心。通过实训我知道不能只扎到书本里面死学习,活学活用灵活掌握,全面提高自己的综合素质,只有这样才能在不久的将来有属于自己的一片天地。在此要特别感谢学校为我们提供了这么好的实训机会。

09时装二班

姜芽

更多类似范文
┣ 工厂电工工作总结范文 900字
┣ 国企工厂党支部年终工作总结范文 2200字
┣ 厂长工作总结范文 2300字
┣ 厂长工作总结范文 2200字
┣ 更多工厂工作总结范文
┗ 搜索类似范文