`

苦逼的工厂模式(Factory Method Pattern)

阅读更多

提到工厂,流水线的工作,不停的重复重复着,真是比我们码农还苦逼。

 

工厂模式使用的频率也是非常高,它的官方解释为:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到其子类。

 


 如图所示,系统中有超级用户与普通用户两种,定义一个公共接口User类,定义一个公共抽象工厂类abstractUserFactory,userFactory类通过继承abstractUserFactory类实现创建User类的方法createUser,从而实现工厂模式,实现代码如下:

<?php
abstract class abstractUserFactory {
	public abstract function createUser();
}

class userFactory extends abstractUserFactory {
	public function createUser( $className ) {
		try{
			if(class_exists($className))
				return new $className();
			else{
				$error = "no class";
    			throw new Exception($error);
    		}
		}catch( Exception $e ) {
			echo 'Caught exception: ',  $e->getMessage(), "\n";
		}
	}
}


interface User{
	public function getGrade();
}

class superUser implements User{
	public function getGrade() {
		echo 1;
	}
}

class commonUser implements User{
	public function getGrade() {
		echo 0;
	}
}

$userFactory = new userFactory();
$userFactory->createUser( 'superUser' )->getGrade();
$userFactory->createUser( 'commonUser' )->getGrade();

运行结果:10Caught exception: no class

 

工厂模式的优点:

1.良好的封装性,代码结构清晰。一个对象创建是有条件约束的,如一个调用者需要一个具体的产品对象,只要知道这个产品的类名(或约束字符串)就可以了,不用知道创建对象的艰辛过程,降低模块间的耦合。

2.扩展性非常好。在增加产品类的情况下,只要适当地修改具体的工厂类或扩展一个工厂类,就可以完成“拥抱变化”。例如在上面的例子中,需要增加一个蓝钻用户,则只需要增加一个blueUser类,工厂类不用修改任务就可完成系统扩展。

3.屏蔽产品类。这一特点非常重要,产品类的实现如何变化,调用者都不需要关心,它只需要关心产品的接口,只要接口保持不变,系统中的上层模块就不要发生变化。

4.典型的解耦框架。高层模块值需要知道产品的抽象类,其他的实现类都不用关心,符合迪米特法则,我不需要的就不要去交流,也符合依赖倒置原则,只依赖产品类的抽象,当然也符合里氏替换原则,使用产品子类替换产品父类,没问题!

 

 

工厂模式的使用场景:

1.工厂模式是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用,但是需要慎重地考虑是否要增加一个工厂类进行管理,增加代码的复杂度。

2.需要灵活的,可扩展的框架时,可以考虑采用工厂模式。万物皆对象,那万物也就是皆产品类。

3.工厂模式可以用在异构项目中。

4.可以使用测试驱动开发的框架下。例如,测试一个类A,就需要把与类A有关联关系的类B也同时产生出来,我们可以用工厂模式把类B虚拟出来,避免类A与类B的耦合。(目前java有jmock和easymock,该场景已弱化)。

 

 

工厂模式的扩展:

1.简单工厂模式(PHP常用)

一个模块仅需要一个工厂类,没有必要把它产生出来,使用静态的方法就可以了,根据这一要求,我们把上例中的abstractUserFactory修改一下,如图:



 去掉了abstractUserFactory抽象类,同时把createUser设置为静态类,简化了类的创建过程。其缺点是工厂类的扩展比较困难,不符合开闭原则,但它仍然是一个非常实用的设计模式。

 

2.升级为多个工厂类(产品与工厂一对一)

每一个产品类都对应一个创建类,好处是创建类的职责清晰,而且结构简单,但是给可扩展性和可维护性带来了一定的影响。如果要扩展一个产品类,就需要建立一个相应的工厂类,这样就增加了扩展的难度。因为工厂类和产品的数量相同,维护时需要考虑两个对象之间的关系。

当然,在复杂的应用中一般采用多工厂的方法,然后再增加一个协调类,避免调用者与各个子工厂交流,协调类的作用是封装子工厂类,对高层模块提供统一的访问接口。

 

3.替代单例模式

 此模式通过反射将一个定义了private的无参构造方法的类实例化而实现的。目测PHP还无法实现,此处略过。

 

4.延迟初始化

一个对象被消费完毕后,并不立刻释放,工厂类保持其初始状态,等待再次被使用。对于PHP解释型语言,可以扩展为延迟加载(lazy loading),即在工厂类准备创建新对象时才载入相应的类文件,而不用每次脚本执行期间都加载可能的类。

1
0
分享到:
评论
2 楼 xuweilovejava 2014-07-31  
                     
1 楼 freezingsky 2014-03-25  
说到工厂模式,现在的java8的方法引用,可以省不少力气。

相关推荐

    设计模式之“工厂方法模式[Factory Method Pattern]”

    今天我们要探讨的是设计模式中的一个经典成员——工厂方法模式(Factory Method Pattern)。工厂方法模式是创建型设计模式的一种,它提供了一种创建对象的最佳方式。 ### 一、什么是工厂方法模式? 工厂方法模式...

    创建型模式之工厂方法模式(Factory Method Pattern)

    在简单工厂模式中,工厂类通常是静态的,负责创建所有类型的对象,这导致在添加新产品时,需要修改工厂类。而在工厂方法模式中,每种产品都有专门的工厂类负责创建,这样就不会有这种问题。 在实际开发中,工厂方法...

    工厂方法模式(FactoryMethod)

    工厂方法模式是面向对象设计模式中的行为型模式之一,它提供了一种...在提供的文件列表中,“FactoryMethod”可能是包含这个简单示例代码的文件。如果有机会查看这个文件,将能更深入地理解工厂方法模式的实现细节。

    创建型模式之抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式是设计模式中的一种创建型模式,其主要目的是为了解耦客户端代码与具体产品的实现。在软件工程中,当系统需要根据不同的平台、环境或者配置产生一系列相关对象,而这些对象之间的关系又非常复杂时,抽象...

    Factory Method Pattern.rar【GoF的工厂方法模式(C#源码)】

    它们都是由不同的厂家生产的,这就是工厂方法模式(FactoryMethod)与前面所说的简单工厂模式(SimpleFactory)的差别。 实例: 多文档系统。我已经用C#的源码编程了:请下载Factory Method Patter.rar

    FactoryMethodPattern.zip

    在"FactoryMethodPattern"的压缩包文件中,我们可以预期包含以下内容: - 示例代码:展示了如何在Swift或Objective-C中实现工厂方法模式。可能包含抽象产品接口、具体产品类、抽象工厂接口和具体工厂类的定义,以及...

    Head First 设计模式 (四) 工厂模式(factory pattern) C++实现

    1. **抽象工厂(Abstract Factory)**:这是工厂模式的核心接口,定义了创建产品对象的公共接口。在C++中,通常用抽象类或者纯虚函数接口来表示。 2. **具体工厂(Concrete Factory)**:实现了抽象工厂接口,负责...

    [创建型模式] head first 设计模式之工厂模式(Factory)

    在C++中,我们可以看到两个文件,`FactoryMethodPattern.cpp`和`FactoryMethodPattern.h`,这通常代表了C++程序的实现部分和头文件部分。在`FactoryMethodPattern.h`中,可能会定义工厂类的接口,包括那个工厂方法。...

    C++的设计模式之工厂方法模式(Factory Method)

    C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method)

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式FACADE PATTERN 8、适配器模式ADAPTER PATTERN 9、模板方法模式TEMPLATE METHOD PATTERN 10、建造者模式BUILDER PATTERN 11、桥梁模式BRIDGE PATTERN 12、...

    创建型模式--工厂模式(Factory Pattern)示范代码

    java 创建型模式--工厂模式(Factory Pattern)示范代码demo,关于工厂模式可以查看我的博客 http://blog.csdn.net/u012930316/article/details/54599580

    【Java设计模式-源码】Factory Method Pattern in Java: 使用多态制造增强灵活性

    **三、Factory Method设计模式的意图** 使用工厂方法模式定义一个用于创建对象的接口,但让子类决定实例化哪个类。这种创建型设计模式允许一个类将实例化推迟到子类,增强了代码的灵活性和可维护性。 **四、通过...

    工厂方法和抽象工厂——Factory Method & Abstract Factory

    在软件设计模式中,工厂方法(Factory Method)和抽象工厂(Abstract Factory)是两种非常重要的创建型模式。它们主要用于解决对象实例化的问题,提供了一种封装对象创建过程的方法,使得代码更加灵活,易于扩展和...

    Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)

    Java设计模式是面向对象编程...在阅读《Chapter1___Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)》的相关资料时,你可以更深入地学习这些模式的细节,包括适用场景、优缺点以及如何在实际项目中实现。

    c++-深入浅出讲解一下 “工厂方法模式 (Factory Method)”

    工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪一个具体类。这样,客户端代码就不需要知道具体的类是什么,只需通过工厂接口获取对象。 工厂...

    C# 工厂模式开发示例,详细展示三种工厂模式

    工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,而不是通过具体类来实例化对象。工厂模式可以将对象的创建过程封装起来,使代码更具有灵活性和可扩展性。 工厂模式有几种常见的...

    Factory Method 工厂方法模式(创建型模式)

    ### Factory Method 工厂方法模式(创建型模式) #### 概述 在软件工程领域,设计模式是一种在特定上下文中解决常见问题的通用方案。Factory Method(工厂方法)模式是GoF(Gang of Four)设计模式之一,属于创建型...

    C#版 24种设计模式

    备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) 单例模式(Singleton Pattern) 迭代器模式(Iterator Pattern) 访问者模式(Visitor ...

Global site tag (gtag.js) - Google Analytics