工厂模式(Factory)

今天重新学习了下工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式,总结下。

首先,从名字上看,三个模式都有”工厂“二字,工厂,自然是生产产品的,工厂模式就是生产类的实例的,而具体生产哪种实例,怎样生产,何时生产,这就是三种工程工厂的区别,以下先分开阐述:

①,简单工厂模式

之所以简单,我觉得在于它就一个工厂,就实现了生产实例的功能(相对于另外两种工厂模式的多个工厂,确实简单很多),具体实现中,只需要告诉该工厂要生产哪种材料(实例),它就会准确的把相应实例产出给你,用起来是很简单,但维护起来可就麻烦些了,因为选择逻辑是在工厂中实现的,依《大话设计模式》中的例子来说,生产加减乘除哪种子类实例,工厂类里会通过switch..case来实现,可想而知,当新添子类(比如开平方根、开立方根等),除了要添加运算子类外,工厂中的switch..case逻辑也要改动,显然这是违背了开放封闭原则的,稍不注意,可能会修改出错而影响程序正确执行。可以说,简单工厂模式有优势(使用简单),也有弊端(维护困难,容易出错),正因为如此,演化出了工厂方法模式:

②,工厂方法模式

相对于简单工厂模式,工厂方法是做了进一步的抽象---对简单工厂模式中的工厂。有变化就应该有抽象吗,既然新增算法(比如开平方根、开立方根等)会修改工厂,那我们就应该对这个变化点做进一步的抽象,抽象出IFactory,让继承它的子工厂决定实例化那一个子类(AddFactory生产new AddClass()....),这样很好的解决了简单工厂模式修改工厂容易出错的弊端:压根不用修改任何类,只是单纯的扩展,添加开平方根运算,就加开平方根运算子类,加开平方根运算工厂,没有修改,只有扩展,遵循了开放封闭原则,这些是优点,缺点呢,就是扩展时需要添加多个子类,稍有啰嗦,不过可以忽略了,架构清楚的话,多添几个类,一劳永逸

③,抽象工厂模式

抽象工厂模式算是基于工厂方法模式吧,就书中的例子已很好的说明问题:多个业务表(用户表、部门表),多数据源操作(sqlserver,access,oracle),就衍生出了更普遍的工厂使用方式:IFactory(工厂基类)定义要操作的业务对象:IUser,IDepartment,子类就实现它,定义具体操作种类(SqlserverFactory:返回sqlserver中对user,department操作的对象..)基本就是工厂方法模式业务的普通化或说复杂化吧,不上代码了,书中都有的(别说没有书啊,《大话设计模式》起码要有吧,个人感觉算是设计模式的启蒙读物了)。

总结:简单工厂,到工厂方法,再到抽象工厂,最后发现抽象工厂过于复杂(还拿书中例子来说,扩展一个业务表(如project)的话,要新增几个类、修改几个工厂),够繁琐,倒不如简单工厂来的直接,一个工厂全部搞定,当然,还可以使用反射、配置文件结合的方式来决定实例化的类,这就要我们在实际用的时候去权衡了,不要一味的遵循某个模式,每个模式都有利有弊,切不可过于教条,只要尽量贴近六大设计原则,合理变通(如之前提到的抽象工厂结合简单工厂,或者用反射、配置文件等),都能更好的优化我们的程序,使代码更优雅简洁,慢慢摸索吧

算是对工厂模式的简单总结--基于思想层面吧,希望能引起读者的思考

时间: 2024-08-24 12:03:47

工厂模式(Factory)的相关文章

工厂模式(Factory)和抽象工厂模式(Abstract Factory)

一.工厂模式(Factory):通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的,工厂方法让类的实例化推迟到子类 (1)涉及角色:抽象产品,具体产品,抽象创建者,具体创建者.                (2)实例:    抽象产品类 1 public abstract class ProductNoodle { 2 public abstract String description(); 3 } 具体产品类 1 public class ConcreteNoodleA e

设计模式(一)工厂模式Factory(创建类型)

设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.可是在一些情况下, new操作符直接生成对象会带来一些问题. 举例来说, 很多类型对象的创造须要一系列的步骤: 你可能须要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你须要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你怎样能轻松方

设计模式一 工厂模式Factory

设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便

设计模式(一)工厂模式Factory(创建型)(转)

原文链接:http://blog.csdn.net/hguisu/article/details/7505909 设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对

设计模式-工厂模式[Factory]

先看下一个简单的实现: 1 package org.masque.designpatterns.factorymethod.one; 2 /** 3 * 4 * Description: Sample子类的标示 5 * BeanEm.java Create on 2014年7月11日 下午2:37:58 6 * @author [email protected] 7 * @version 1.0 8 * Copyright (c) 2014 Company,Inc. All Rights Res

设计模式(一)工厂模式Factory(创建型)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实例的细节和

工厂模式(Factory Patter)

1.工厂模式简介 工厂模式属于创建型模式,是专门用来创建对象的模式,抽象了实例化的过程.工厂模式分为 : 工厂方法模式.抽象工厂模式. 在学习工厂方法模式.抽象工厂之前,首先先要了解一下简单工厂模式,简单工厂不在23种设计模式之列,一般它是根据自变量的不同而返回不同的类型.比较简单实用一些,在学习工厂模式之前下来学习一下简单工厂,有助于我们理解工厂模式. 1.1.简单工厂定义 简单工厂是由一个工厂对象决定创建出哪一种产品类的实例. 其实质就是由一个工厂类根据传入的参数,来决定调用哪一个产品类的实

工厂模式(factory pattern)

工厂模式主要用来封装对象的创建,有3种分类:简单工厂(simple factory).工厂方法(factory method).抽象工厂(abstract factory). 简单工厂包括3种组成元素:抽象产品.具体产品.具体工厂(简单工厂),结构图如下: C++实现: //抽象产品 class Car { public: virtual string getDescription() = 0; }; //具体产品 class Audi : public Car { string getDesc

设计模式(二)工厂模式Factory (创建型)

工厂模式分为三种:简单工厂模式 (Simple Factory) .工厂方法模式(Factory Method).抽象工厂模式(Abstract Factory) //举例:发送邮件和短信的例子 /** * @author Administrator * 产品类 */interface Sender{ void send();}class MailSender implements Sender{ @Override public void send() { System.out.println

设计模式~简单工厂模式(Factory)

简单工厂模式Simple Factory根据提供给它的数据,返回一个类的实例.通常它返回的类都有一个公共的父类(或者接口对象). 简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类.简单工厂实例化的类具有相同的接口或者基类,在子类比较固定并不需要扩展时,可以使用简单工厂.如数据库生产工厂就是简单工厂的一个应用.         采用简单工厂的优点是可以使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性:缺点是可实例化的类型在编译期间已经被确定,如果增加新类 型,