设计模式学习之--工厂模式

今天学习的设计模式是工厂模式。那么为什么叫它工厂模式呢?工厂模式,顾名思义就是用一个工厂生产各种东西,工厂模式是如何体现的呢?

首先,工厂模式有简单的工厂模式和抽象工厂模式两种,我们先用一个发型的工厂来演示一下简单的工厂模式:

一个发型接口:工厂模式是面向接口编程的,这样可以更易于程序的扩展

package com.sunny.project;
/**
 * 发型接口
 * @author Administrator
 *
 */
public interface HairInterface {

	/**
	 * 画一个发型
	 */
	public void draw();
}

写两个发型实现这个接口:

package com.sunny.project;
/**
 * 左偏分发型
 * @author Administrator
 *
 */
public class LeftHair implements HairInterface {

	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println("-----------------左偏分发型-------------------");
	}

}

package com.sunny.project;
/**
 * 右偏分发型
 * @author Administrator
 *
 */
public class RightHair implements HairInterface {

	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println("-----------------右偏分发型-------------------");
	}

}

假若我们不使用工厂模式,那么我们一般就是new这两个对象进行我们的操作,但是这样是很不利于我们程序的管理的,因为这些发型都是属于发型接口的实现,我们能不能通过一个总的类来对这系列的发型进行产生实例呢?这个时候就是工厂模式的应用了,我们写一个专门生产发型的工厂类:

package com.sunny.project;

import java.util.Map;

/**
 * 发型工厂
 * @author Administrator
 *
 */
public class HairFactory {

	/**
	 * 根据类型来创建对象
	 * @param key
	 * @return
	 */
	public HairInterface getHair(String key){
		if("left".equals(key)){
			return new LeftHair();
		}else if("right".equals(key)){
			return new RightHair();
		}
		return null;
	}
	/**
	 * 根据类的名称来生产对象
	 * @param className
	 * @return
	 */
	public HairInterface getHairByClass(String className){

		try {
			HairInterface hair = (HairInterface) Class.forName(className).newInstance();
			return hair;
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 根据类的名称来生产对象
	 * @param className
	 * @return
	 */
	public HairInterface getHairByClassKey(String key){

		try {
			Map<String, String> map = PropertiesReader.getInstance().getProperties();

			HairInterface hair = (HairInterface) Class.forName(map.get(key)).newInstance();
			return hair;
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

这里我们提供了不同的方法生产,在我们的java程序中,有很多类的实现其实我们不需要在意细节,只需要提供创建他们的方法就可以(最后一个使用配置文件读取的)

配置文件如下type.properties:

left=com.sunny.project.LeftHair
right=com.sunny.project.RightHair
in=com.sunny.project.InHair

这样,我们的发型就由这个工厂来生产,我们只需要关注我们需要什么就可以了,这是测试类:

package com.sunny.project;

public class SunnyTest {

	public static void main(String[] args){

//		HairInterface left = new LeftHair();
//		left.draw();

		HairFactory factory = new HairFactory();
		HairInterface right =  factory.getHair("right");
		right.draw();

		HairInterface left = factory.getHairByClass("com.sunny.project.LeftHair");
		left.draw();

		HairInterface hair = factory.getHairByClassKey("left");
		hair.draw();
}
}

这就是简单工厂模式。

那么抽象工厂模式呢?

其实,抽象工厂模式和简单工厂模式的区别在于,抽象工厂可以产生多个产品族,我们的简单工厂是一个工厂类,我们的抽象工厂是一个接口,抽象工厂的好处就是可以让我们的程序在不同的扩展中实现更多的产品族,以实现更好的扩展。

那么在什么情况下需要应用我们的工厂模式呢?

1.一个系统不应该被创建不同的产品时的细节组成和几个所依赖,系统应该和这些实例的创建区分开让我们关注业务。

2.这个系统至少有一个产品的系列

3.同一个产品的系列是被设置成在一起使用的

4.不同的产品以一系列的接口面貌出现,从而使系统不依赖于接口实现的细节。

在我们的经常使用的java框架中,我们的jdbc就是利用工厂模式,jdbc只提供一个生产数据操作对象的工厂,不同的数据库只需要实现jdbc的统一的数据接口操作,我们的客户端只使用jdbc提供的这个工厂来获取操作数据库的实例,从而实现统一和灵活的使用。

同样,我们spring中的beanfactory也是这样,所有javabean都通过一个工厂来产生,我们只需要用一个get加上他的键名就可以得到实例,非常的简单易用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 22:01:21

设计模式学习之--工厂模式的相关文章

设计模式学习02—工厂模式

1.动机与定义 我们在程序中使用一个对象时,需要new一下,如果需要设置其他值就再初始化一下.比如我要使用一个按钮,手动new一个矩形按钮,然后初始化一些值,如显示文字,背景色等. // 矩形按钮 IButton btn = new RecButton(); // 初始化其他值 btn.setText("提交"); btn.setBackgroundColor("#00aaff"); // 其他初始化省略 // 圆形按钮 IButton btn2 = new Rou

设计模式学习笔记-工厂模式

一.概述 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法(Factory Method)使一个类的实例化延迟到其子类: 2.模式中的角色 Product(Map):定义工厂方法所创建的对象的接口. ConcreteProduct(BaiduMap.GaodeMap):具体Product,实现Product接口. Creator(IMapFactory):声明工厂方法,该方法返回一个Product类型的对象. ConcreteCreator(BaiduMapFactory.Gaod

&lt;C/C++ 版&gt; 设计模式 学习之 工厂模式 &lt;1&gt;

大话设计模式这本书使用 C# 语言写的,我用的是 C++ 语言,最近在看这本书,所以用 C++ 语言走了一遍. 以下是部分笔记,包括代码 若不涉及面向对象这个概念,我们写的简易计算器可能是下面这个样子 //User.cpp --- 客户端 #include "iostream" int main() { using namespace std; cout<<"Input First Number : "; int number_a; cin>>

设计模式学习——简单工厂模式

模式概述:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类,简单工厂(Simple Factory)模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,但其不属于23种GOF设计模式之一,通常它根据自变量的不同返回不同的类的实例.     UML类图: 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建出哪一个产品类的实例.由上图可以看出,简单工厂模式有工厂.抽象产品.具体产品三个角色. 工厂角色(Factory) 是

设计模式学习之工厂模式[转]

工厂模式笔记 摘自http://blog.csdn.net/wuzhekai1985 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解.主要参考<大话设计模式>和<设计模式:可复用面向对象软件的基础>两本书.本文介绍工厂模式的实现. 工厂模式属于创建型模式,大致可以分

Java设计模式学习三-----工厂模式

工厂模式 工厂模式(Factory Pattern)是Java中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象. 工厂模式的思路:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行.使用过程中做好接口选择. 优点:1.一个调用者向创建一个对象,只要知道名称就可以了.2.扩展性高,如果想增加一个产品,只要扩展一个工厂

设计模式学习-简单工厂模式

1.什么是简单工厂模式 简单工厂模式属于类的创建模式,又叫做静态工厂模式,是通过专门建立一个类负责创建其他类的实例,被创建的类通常有着共同的父类,之所以称之为工厂,就是因为负责创建其他类的类能够根据传递参数的不同,产生不同的实例,使得程序满足松耦合.重用度高.易修改维护的特点. 2.简单工厂模式的实现 下面举例说明工厂模式,比如说我们要实现一个两个数的size运算,那么如何去设计能过做到我们上面说的特性.首先我们要设定一个运算的终极父类: #include <iostream> #includ

(@WhiteTaken)设计模式学习——抽象工厂模式

抽象工厂模式,可以向客户端提供一个接口,而客户端不用指定具体的类型创建对象,却能够创建多个产品族(一类具有共性产品,如地域等)的对象. 下面直接上代码. 1.苹果需要实现水果的接口,而苹果可以有北方的苹果,也可以有南方的苹果,所以也可以抽象成一个父类. 1 public interface Fruit { 2 public void Get(); 3 } 4 5 public abstract class Apple implements Fruit{ 6 public abstract voi

php设计模式学习之工厂模式

我的认为:所为工厂模式是事先有一系类class,一个工厂类' 工厂类根据不同的参数创建不同的对象,调用各自的方法; php利用工厂模式实现计算器: ?php /** * Created by PhpStorm. * User: modern * Date: 16-7-19 * Time: 下午5:24 * 简单工厂模式两数运算器 */ echo "hello factory models<br/>"; echo "begin<br/>"; i