理解设计模式(工厂)

  工厂模式,见名知意:创建工厂,来生产商品。
  Java中,工厂和商品就是对象。

使用时机
工厂模式功能上相当于new,都是创建对象
但前者名称决定,其具有工厂的特性

  • 工厂根据要求生产商品,商品种类并不单一
  • 工厂如何生产,外界不需要得知

对于Java来说,工厂模式按条件获取不同类的对象,同时屏蔽对象的细节

分为

  • 简单工厂
  • 工厂方法
  • 抽象工厂3种

简单工厂模式 —— Simple Factory

3个角色:工厂类F、抽象产品A、具体产品C
具体来说,C实现A,F生产A,但实际C被创建
一句话,父类变量指向子类对象

F:由具体类实现,一般有判断和业务逻辑
A:由接口或抽象类实现,一般有抽象方法,供C实现
C:由具体类继承或实现A,F实际创建对象类

CarFactory.java

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
package com.suzhw.design.pattern.factory.factory;

import java.util.HashMap;import java.util.Map;

import com.suzhw.design.pattern.factory.product.Car;import com.suzhw.design.pattern.factory.product.impl.AudiCar;import com.suzhw.design.pattern.factory.product.impl.BenZCar;import com.suzhw.design.pattern.factory.product.impl.QQCar;import com.suzhw.util.string.StringUtil;

/** * @author suzhw<br> *         日期:2014-7-12<br> *         功能:根据需求,生产汽车<br> * @version 1.0 * @see */public class CarFactory {	private static Map<String, Integer> carType;

	static {		CarFactory.carType = new HashMap<String, Integer>();		CarFactory.carType.put("AudiCar", 1);		CarFactory.carType.put("BenZCar", 2);		CarFactory.carType.put("QQCar", 3);	}

	public CarFactory() {	}

	/**	 * 根据条件,生产汽车	 * 	 * @param target	 * @throws Exception	 */	public static Car produceCar(String target) throws Exception {		if (StringUtil.isValidate(target)) {			return proCarByTarget(target);		} else {			throw new Exception("原料不足,无法生产");		}	}

	/**	 * <pre>	 * @author suzhw	 * 2014-7-12 下午7:47:38	 * <b>作用:按条件,生产汽车</b>	 * <b>使用场合:内部方法,屏蔽生产细节</b>	 * 	 * @param target	 * @return <br/>	 * return: Car	 * @throws Exception 	 * @exception 	 * @since  1.0.0	 * </pre>	 */	private static Car proCarByTarget(String target) throws Exception {		switch (CarFactory.carType.get(target)) {			case 1:				return new AudiCar();			case 2:				return new BenZCar();			case 3:				return new QQCar();			default:				throw new Exception("无法生产");		}	}}

Car.java

123456789101112131415161718192021222324
package com.suzhw.design.pattern.factory.product;

/** * @author suzhw<br> * 日期:2014-7-12<br> * 功能:车<br> * @version 1.0 * @see */public interface Car {	/**	 * <pre>	 * @author suzhw	 * 2014-7-12 下午8:17:13	 *	<b>作用:汽车启动</b>	 *	<b>使用场合:汽车启动时</b>	 * <br/>	 * return: void	 * @exception 	 * @since  1.0.0	 *</pre>	 */	public void start();}

AudiCar.java

1234567891011
package com.suzhw.design.pattern.factory.product.impl;

import com.suzhw.design.pattern.factory.product.Car;

public class AudiCar implements Car {

	public void start() {		System.out.println("奥迪车启动");	}

}

BenZCar.java

1234567891011
package com.suzhw.design.pattern.factory.product.impl;

import com.suzhw.design.pattern.factory.product.Car;

public class BenZCar implements Car {

	public void start() {		System.out.println("奔驰车启动");	}

}

QQCar.java

1234567891011
package com.suzhw.design.pattern.factory.product.impl;

import com.suzhw.design.pattern.factory.product.Car;

public class QQCar implements Car {

	public void start() {		System.out.println("QQ车启动");	}

}

可以看出,简单工厂模式,产品抽象实现,而工厂具体实现
如此,产品符合开闭原则
可以不断扩展产品的种类,但每扩展一次,都要修改工厂类

工厂方法模式避免了这种修改

工厂方法模式 —— Factory Method

相比于简单工厂模式,工厂方法模式的角色增加到4个

  • 抽象工厂:核心,与业务无关,接口或抽象类实现
  • 具体工厂:含业务逻辑,具体类实现
  • 抽象产品:接口或抽象类实现
  • 具体产品

该模式,是一个工厂,只生产一种商品
不过要先确定使用哪种工厂类

抽象工厂模式 —— Abstract Factory

先说等级结构产品族
等级结构:相当于产品的不同品牌
产品族:相当于不同品牌、但功能相似的产品集合

抽象工厂模式,一个工厂,能够生产不同品牌下、功能相似产品组成的产品族

工厂接口中可不声明方法
若已知产品族数量时,可以按需声明
若产品族数量发生变化,则可重新声明工厂接口

时间: 2024-12-18 08:28:38

理解设计模式(工厂)的相关文章

Asp.net设计模式笔记之一:理解设计模式

GOF设计模式著作中的23种设计模式可以分成三组:创建型(Creational),结构型(Structural),行为型(Behavioral).下面来做详细的剖析. 创建型 创建型模式处理对象构造和引用.他们将对象实例的实例化责任从客户代码中抽象出来,从而让代码保持松散耦合,将创建复杂对象的责任放在一个地方,这遵循了单一责任原则和分离关注点原则. 下面是“创建型”分组中的模式: 1.Abstract Factory(抽象工厂)模式:提供一个接口来创建一组相关的对象. 2.Factory Met

iOS设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

1. 简单工厂模式 如何理解简单工厂,工厂方法, 抽象工厂三种设计模式? 简单工厂的生活场景,卖早点的小摊贩,他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂,它生产包子,馒头,地沟油烙的煎饼.该场景对应的UML图如下所示: 图1:简单工厂模式UML图 简单工厂模式的参与者: 工厂(Factory)角色:接受客户端的请求,通过请求负责创建相应的产品对象. 抽象产品(Abstract Product)角色: 是工厂模式所创建对象的父类或是共同拥有的接口.可是抽象类或接口. 具体产品(Conc

设计模式——工厂模式(Factory)

要想正确理解设计模式,首先必须明白它是为了解决什么问题而提出来的. 设计模式学习笔记 --Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 1.概念 工厂模式定义:实例化对象,用工厂方法取代new操作.达到解耦的目的(避免硬编码耦合).工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式. 工厂模式是我们最经常使用的模式了,著名的Jive论坛 ,就大量使用了工

iOS常用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

1. 简单工厂模式 如何理解简单工厂,工厂方法, 抽象工厂三种设计模式? 简单工厂方法包含:父类拥有共同基础接口,具体子类实现子类特殊功能,工厂类根据参数区分创建不同子类实例.该场景对应的UML图如下所示: 代码结构如下 Animal 类 @interface Animal :NSObject @proterty(nonatomic,strong) NSString *name; -(void)laugh; @end Dog类 @interface Dog:Animal @end Cat类 @i

iOS经常使用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

1. 简单工厂模式 怎样理解简单工厂,工厂方法. 抽象工厂三种设计模式? 简单工厂的生活场景.卖早点的小摊贩.他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂.它生产包子,馒头,地沟油烙的煎饼. 该场景相应的UML图例如以下所看到的: 图1:简单工厂模式UML图 简单工厂模式的參与者: 工厂(Factory)角色:接受client的请求,通过请求负责创建对应的产品对象. 抽象产品(Abstract Product)角色:是工厂模式所创建对象的父类或是共有的接口.但是抽象类或接口. 详细产品

java--面向对象--设计模式--工厂模式

今天第一次接触Java的工厂设计模式,我可是闻名已久啊. 看下面: Java代码   interface Fruit { public void eat(); } class Apple implements Fruit { public void eat() { System.out.println("吃苹果"); } } class Orange implements Fruit { public void eat() { System.out.println("吃桔子&

深入理解设计模式---系列目录

一.创建型模式 深入理解设计模式(一):单例模式(Singleton pattern): 确保一个类只有一个实例, 并提供全局访问点. 深入理解设计模式(二):简单工厂模式(factory method pattern): 实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. 深入理解设计模式(四):工厂方法模式(factory method pattern): 定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个. 工厂方法让类把实例

设计模式--工厂和策略的区别(转)

名词理解: 工厂(Factory)模式我们可以做如下理解,假设有一个Audi的公司生产汽车(似乎也不用假设了),它掌握一项核心的技术就是生产汽车,另一方面,它生产的汽车是有不同型号的,并且在不同的生产线上进行组装.当客户通过销售部门进行预定后,Audi公司将在指定的生产线上为客户生产出它所需要的汽车. 策略(Strategy)模式在结构上与工厂模式类似,唯一的区别是工厂模式实例化一个产品的操作是在服务端来做的,换句话说客户端传达给服务端的只是某种标识,服务端根据该标识实例化一个对象.而策略模式的

Python设计模式——工厂方法模式(FactoryMethod)

需求:有一个学雷锋活动,有买米和扫地两个内容,参与的人有大学生和社区志愿者,他们各自的方法不一样. 如果用简单工厂模式实现: #encoding=utf-8 __author__ = '[email protected]' class LeiFeng(): def buy_rice(self): pass def sweep(self): pass class Student(LeiFeng): def buy_rice(self): print '大学生帮你买米' def sweep(self

设计模式------工厂三姐妹

设计模式学完了,我是按照大话书上的顺序一个一个学习的,其中有三个模式名称中含有"工厂"这两个字眼,而且都属于创建型,它们就是"工厂三姐妹",下面我们通过计算器的示例来好好认识一下这姐妹三儿. 简单工厂模式: 简单工厂类中的代码: 从中我们可以看到,当用户请求进行加法运算时,只需operationFactory.createOperate("+"),工厂就会自动给出一个加法类的实例,用户根本不用和具体的运算类打交道,对象的创建过程被封装起来了.但是