设计模式之创建型模式—— 1.3 抽象工厂模式

<?php

	/**
	 * 1.3 抽象工厂模式
	 * 解决的问题:
	 * 		如何解决多个类实例化对象的问题。
	 * 解决的方案:
	 * 		提供一个创建一系列相关或相互依赖对象的
	 * 	 	接口,而无需指定它们具体的类。
	 * 该模式包含四种角色:
	 * 		1. 抽象产品角色(两个或多个)
	 * 			职责:同工厂方法模式
	 * 	 	2. 具体产品角色
	 * 		 	职责:同工厂方法模式
	 * 	   	3. 抽象工厂角色
	 * 		 	职责:同工厂方法模式
	 * 	   	4. 具体工厂角色
	 * 		   职责:同工厂方法模式
	 * 优点:
	 * 		1. 易于交换产品系列,由于工厂类在
	 * 		   一个应用中只需要在初始化的时候
	 * 		   出现一次,这就使得改变一个应用
	 * 		   的具体工厂变得非常容易,它只需
	 * 		   要改变具体工厂即可使用不同的产
	 * 		   品配置。
	 * 		2. 使具体的创建实例过程与客户端分
	 * 		   离,客户端时通过它们的抽象接口
	 * 		   操纵实例,产品的具体类名也被具
	 * 		   体工厂的实现分离,不会出现在客
	 * 		   户代码中。
	 * 缺点:
	 * 		1. 当增加新的产品时,就要增加抽象
	 * 		   产品角色、具体产品角色、具体工
	 * 		   厂角色三个角色(类),另外至少
	 * 		   还要修改抽象工厂角色。
	 * 		2. 在客户端很多的话,如果要进行产
	 * 		   品的切换,那么就会出现大批量的
	 * 		   改动。
	 * 使用场景:
	 * 		1. 一个系统要独立于它的产品的创建
	 * 		   、组合和表示时。
	 * 		2. 一个系统要由多个产品系列中的一
	 * 		   个来配置时(比如数据库)。
	 * 		3. 当你要强调一系列相关产品对象的
	 * 		   设计以便进行联合使用时。
	 * 		4. 当你提供一个产品类库,而只想显
	 * 		   示它们的接口而不是实现时。
	 * 		   
	 */

	/**
	 * 以两种数据库产品来举例
	 */

	//第一种抽象产品类
	abstract class User{
		abstract public function addUser();
		abstract public function queryUser();
	}

	//第二种抽象产品类
	abstract class Department{
		abstract public function addDeptmt();
		abstract public function queryDeptmt();
	}
	/**
	 * 第三种抽象产品类
	 * 		.
	 * 		.
	 * 		.
	 * 		.
	 * 	第N种抽象产品类
	 */

	//第一种抽象产品类的具体产品类
	//用户的添加和查询
	//MysqlUser是抽象产品User的第一个具体产品类
	class MysqlUser extends User{
		public function addUser(){
			echo ‘在Mysql数据库中添加一个用户‘;
		}
		public function queryUser(){
			echo ‘在Mysql数据库中查询某个用户信息‘;
		}
	}

	//MongodbUser是抽象产品User的第二个具体产品类
	class MongodbUser extends User{
		public function addUser(){
			echo ‘在MongoDB数据库中添加一个新用户‘;
		}
		public function queryUser(){
			echo ‘在MongoDB数据库中查询某个用户信息‘;
		}
	}  

	//第二种抽象产品类的具体产品类
	//部门的添加和查询
	//MysqlDeptmt是抽象产品Department的第一个具体产品类
	class MysqlDeptmt extends Department{
		public function addDeptmt(){
			echo ‘在Mysql数据库中添加一个新部门‘;
		}
		public function queryDeptmt(){
			echo ‘在Mysql数据库中查询某个部门信息‘;
		}
	}

	//MongodbDeptmt是抽象产品Department的第二个具体产品类
	class MongodbDeptmt extends Department{
		public function addDeptmt(){
			echo ‘在MongoDB数据库中添加一个新部门‘;
		}
		public function queryDeptmt(){
			echo ‘在MongoDB数据库中查询部门信息‘;
		}
	}

	//抽象工厂角色
	abstract class DBFactry{
		//因为是有两个抽象产品,多以与之对应的
		//应该有两个创建响应产品对象的方法。
		abstract static public function createUser();
		abstract static public function createDept();
	}

	/**
	 * 具体工厂角色
	 * 每个抽象产品角色对应的具体产品角色都有
	 * 一个与之对应的具体工厂角色,也就是说抽
	 * 象产品对应多少个具体的产品,就有多少个
	 * 具体产品工厂角色与之对应。因为抽象工厂
	 * 方法对应的是多个产品,所以可以在具体工
	 * 厂中返回多个具体产品的实例对象。
	 */
	//MysqlDBFactry是与具体产品MysqlUser和
	//MysqlDeptmt对应的具体工厂类。
	class MysqlDBFactry extends DBFactry{
		public static function createUser(){
			return new MysqlUser();
		}
		public static function createDept(){
			return new MysqlDeptmt();
		}
	}

	//MongoDBFactry是与具体产品MongodbUser和
	//MongoDeptmt对应的具体工厂类。
	class MongoDBFactry extends DBFactry{
		public static function createUser(){
			return new MongodbUser();
		}
		public static function createDept(){
			return new MongodbDeptmt();
		}
	}

	/**
	 * 使用简单工厂改进抽象工厂
	 * 改进后的优点:
	 * 		1. 当切换数据库时,客户端无需任何
	 * 		   修改。
	 * 	缺点: 
	 * 		如果再新增一种数据库,那么就要添加
	 * 		一个具体产品类,修改简单工厂中相关
	 * 		的switch语句。
	 * 		   
	 */
	class SimpleFactry{
		//$db:作为数据库切换变量
		private static $db=‘mysql‘;
		public static function createUser(){
			switch (self::$db) {
				case ‘mysql‘:
					$obj=new MysqlUser();
					break;
				case ‘mongodb‘:
					$obj=new MongodbUser;
					break;
			}
			return $obj;
		}

		public static function createDept(){
			switch(self::$db){
				case ‘mysql‘:
					$obj=new MysqlDeptmt();
					break;
				case ‘mongodb‘:
					$obj=new MongodbDeptmt();
					break;
			}
			return $obj;
		}
	}

	/**
	 * 利用反射技术进一步改进抽象工厂模式
	 */
	class ReflctSmplFactry{
		private static $db=‘Mysql‘;
		public static function createUser(){
			$className=self::$db.‘User‘;
			$reflct=new ReflectionClass($className);
			return $reflct->newInstance();
		}	

		public static function createDept(){
			$className=self::$db.‘Deptmt‘;
			$reflct=new ReflectionClass($className);
			return $reflct->newInstance();
		}
	}

//正常抽象工厂模式的客户端
	$factry=MysqlDBFactry::createDept();
	$factry->addDeptmt();
	$factry->queryDeptmt();
	$f2=MongoDBFactry::createUser();
	$f2->addUser();
	$f2->queryUser();

// 使用简单工厂改进后的抽象工厂模式的客户端
	$fcty=SimpleFactry::createUser();
	$fcty->addUser();
	$fcty->queryUser();
	$fcty2=SimpleFactry::createDept();
	$fcty2->addDeptmt();
	$fcty2->queryDeptmt();

// 使用反射技术改进后的抽象工厂模式的客户端
	$fctry=ReflctSmplFactry::createUser();
	$fctry->addUser();
	$fctry->queryUser();

	$fctry2=ReflctSmplFactry::createDept();
	$fctry2->addDeptmt();
	$fctry2->queryDeptmt();
?>
时间: 02-16

设计模式之创建型模式—— 1.3 抽象工厂模式的相关文章

(创建型模式三)抽象工厂模式

package com.eyugame.modle; /** * 抽象工厂模式 * * @author JYC506 * */ public class MyFactory implements IAbstractFactory { @Override public IProduct1 createIProduct1() { return new Product1(); } @Override public IProduct2 createIProduct2() { return new Pro

设计模式那点事读书笔记(2)----抽象工厂模式

抽象工厂模式: 此模式提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类. 解决什么问题: 抽象工厂模式允许客户在使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新产品.从而实现客户从具体的产品中解耦. UML: 代码结构: 代码: 定义抽象产品: package com.demo.factory.model; /** * 抽象产品 */ public abstract class AbstractBa

《JAVA与模式》之抽象工厂模式

场景问题 举个生活中常见的例子--组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU.硬盘.内存.主板.电源.机箱等.为讨论使用简单点,只考虑选择CPU和主板的问题. 事实上,在选择CPU的时候,面临一系列的问题,比如品牌.型号.针脚数目.主频等问题,只有把这些问题都确定下来,才能确定具体的CPU. 同样,在选择主板的时候,也有一系列问题,比如品牌.芯片组.集成芯片.总线频率等问题,也只有这些都确定了,才能确定具体的主板. 选择不同的CPU和主板,是每个客户在组装电脑的时候,向

工厂模式三部曲之抽象工厂模式

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码.因为抽象工厂不太好理解,我们先看看图,然后就和代码,就比较容易理解. 举例如下:(我们举一个发送邮件和短信的例子) public interface Sender { public void Send(); } 两个实现类:

设计模式3 创建型模型

设计模式3 创建型模型 目录: 简单工厂模式 工厂方法模式 抽象工厂模式 单例模式 简单工厂 模型 [email protected]:~$ cat main.cpp  //设计模式:简单工厂 模型 #include<iostream> using namespace std; class Fruit { public: Fruit(string kind) { this->kind = kind; if(kind == "apple") {} else if (ki

设计模式-抽象工厂模式(C#)

设计模式--抽象工厂模式(JAVA) 在抽象工厂模式中,一个具体工厂可以生产一组相关的具体产品,这样的一组产品成为产品族,产品族中的每一个产品都属于某一个产品继承等等级结构.当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构.属于不同类型的具体产品时就可以使用抽象工厂模式. 抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建,当一个工

设计模式之抽象工厂模式20170803

创建型设计模式之抽象工厂模式: 一.含义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类. 具体来说, 为一组具有相同约束(属性)的对象,提供一个接口,这个接口下有不同的实现,每个实现类对应一种类型的约束(一种具体的属性),同时提供该类型的约束(属性)下所有对象的创建方法 二.代码说明 1.主要有两个角色 1)一组互相影响的产品线(对象),也叫做产品族 2)抽象工厂类及其实现类 抽象工厂类:在N个产品族中,在抽象工厂类中就应该有N个创建方法 实现类:具体实现类是产品族的具体

23种设计模式(3):抽象工厂模式

定义:为创建一组相关或相互依赖的对象提供一个接口,并且无需指定他们的详细类. 类型:创建类模式 类图: 抽象工厂模式与工厂方法模式的差别 抽象工厂模式是工厂方法模式的升级版本号,他用来创建一组相关或者相互依赖的对象.他与工厂方法模式的差别就在于,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式则是针对的多个产品等级结构.在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的全部产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类

java设计模式-创建型

1.设计模式介绍 1.1 设计模式的概念 1.设计模式是一套被反复使用,多数人知晓,经过分类编码目的的优秀代码设计经验的总结. 2.设计模式贯彻的原理:面向接口编程,而不是面向对象实现. 3.设计模式的目标:降低耦合性,增强灵活性. 1.2 设计模式的要素 1.模式名称 2.问题 3.环境与初始环境 4.解决方案 5.效果 6.举例 7.末态环境 8.推理 9.其他有关模式 10.已知的应用 1.3设计模式的分类 1.创建型 1.1  单例模式 1.2  工厂模式 1.3  抽象工厂模式 1.4