简单工厂模式的一些基本知识
本文主要参见自《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. 联系
单例模式是建立在简单静态工厂模式基础之上的。