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