天天看点

简单工厂模式--使用--扩展--缺点--适用情况--简单工厂模式的一些基本知识

简单工厂模式的一些基本知识

本文主要参见自《Java与模式》

一、UML类图表示如下

简单工厂模式--使用--扩展--缺点--适用情况--简单工厂模式的一些基本知识

二、角色如下

1.Product接口:
a.含有具体产品的共有接口。
2.ProductA,ProductB
a.工厂类所创建的这个角色的实例。
3.Factroy:
a.简单工厂模式的核心。
b.工厂类在客户端的直接调用下创建产品对象。

三、基本代码实现如下:

1.Product接口:
package com.jue.dp;
public interface Fruit {

	void grow();
	
	void harvest();
	
	void plant();
}
           
2.ProductA,ProductB
package com.jue.dp;

public class Apple implements Fruit {
	public static final String APPLE = "apple";

	@Override
	public void grow() {
		LogUtil.logs(APPLE, "grow");
	}

	@Override
	public void harvest() {
		LogUtil.logs(APPLE, "harvest");
	}

	@Override
	public void plant() {
		LogUtil.logs(APPLE, "plant");
	}

}
           
其他雷同!
3.Factroy:
package com.jue.dp;

public class FruitFactory {

	public static Fruit newInstance(String name) {
		if (name.equals("Apple")) {
			return new Apple();
		}

		if (name.equals("Grape")) {
			return new Grape();
		}

		if (name.equals("Strawberry")) {
			return new Strawberry();
		}
		throw new BadFruitException(name);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Fruit f1 = FruitFactory.newInstance("Apple");
		f1.plant();
		f1.grow();
		f1.harvest();
	}
}
           

四、优点:

1.责任分割:客户端可以免除直接创建产品对象的责任,客户端无需考虑如何创建,只需要知道创建什么以及负责消费产品。

五、缺点

1.开闭原则:
a.客户端符合开比原则
b.工厂类不符合:需要修改核心类,增加新的产品将导致工厂类的修改。

2.Factory变得臃肿:当产品比较多的时候,factory会无比臃肿。

3.无法继承:简单静态工厂的创建方法通常是static的,导致工厂角色无法形成继承结构。

六、扩展 : 使用反射可以创建任意产品对象。

public class FruitFactory2 {

	public static Fruit newInstance(String name) {

		Fruit f = null;
		try {
			f = (Fruit) Class.forName(name).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return f;
	}
	
	public static void main(String args[]){
		Fruit f1 = FruitFactory2.newInstance("com.jue.dp.Apple");
		f1.plant();
		f1.grow();
		f1.harvest();
	}
}
           

七、使用场景

a.简单工厂模式所创建的对象往往属于一个产品等级。

b.创建的对象比较少。

c.客户端关心于创建什么以及如何消费,而不关心如何创建。

八、简单工厂模式与单例模式的关系

1.抽象产品省略,工厂角色与具体产品合并,这种退化的简单工厂模式与单例有很多相似之处,但是与单例是不同的。

2.不同之处:

工厂模式总是创建新的实例。
单例模式要求单例类的构造器是私有的,禁止外部客户端对其实例化。
3. 联系
单例模式是建立在简单静态工厂模式基础之上的。 

继续阅读