设计模式-02-工厂方法模式的剖析
本文主要参见自《Java与模式》另外还有《设计模式之禅》 一、定义
1.将实际创建工作推迟到工厂接口的子类中。
二、简单工厂的优缺点
1.开闭原则支持的不够:客户端支持开闭原则,但是工厂本身不支持开闭原则。如果有新的产品过来,就需要相应的修改工厂类。
三、工厂方法模式的引进
1.工厂方法模式是简单工厂模式的进一步抽象和改进,工厂模式克服了简单工厂开比原则支持不够的问题。 2.核心的工厂类,不再负责所有产品的创建,将具体的创建工作交给子类,核心类变成了抽象工厂角色。 3.允许在不修改具体工厂角色的情况下引入新的产品。 4.通常首先有产品角色,然后有工厂角色,也就是说,通常按照产品的等级结构设计一个同结构的工厂等级结构。
五、UML图
1.类图
2.时序图六、角色
1.抽象工厂类 2.具体工厂类 3.抽象产品类 4.具体产品类七、code实现 1.抽象工厂类
2.具体工厂类package com.jue.dp;
public interface IFactory {
IProduct newInstance();
}
3.抽象产品类package com.jue.dp;
public class ConcreteFactoryA implements IFactory {
@Override
public IProduct newInstance() {
return new ConcreteProductA();
}
}package com.jue.dp;
public class ConcreteFactoryB implements IFactory {
@Override
public IProduct newInstance() {
return new ConcreteProductB();
}
}
package com.jue.dp;
public interface IProduct {
void display();
}
4.具体产品类
package com.jue.dp;
public class ConcreteProductA implements IProduct {
@Override
public void display() {
System.out.println("ConcreteProductA->display");
}
}package com.jue.dp;
public class ConcreteProductB implements IProduct {
@Override
public void display() {
System.out.println("ConcreteProductB->display");
}
}
5.测试类
package com.jue.dp;
public class MainClass {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
IFactory fa = new ConcreteFactoryA();
IProduct pa = fa.newInstance();
pa.display();
}
}
八、优点
1.符合开闭原则,如果系统需要添加一个新的产品,那么需要的就是向系统中添加一个产品类及他所对应的具体工厂。扩展优秀。 2.屏蔽了产品类的创建 。九、缺点
1.过多的产品可能引起类膨胀。十、使用场景
1.不关心对象的创建过程,直关心创建的物件,以及消费物件。 2.使用灵活的,可扩展的框架时,可以考虑使用工厂方法模式。
十一、在 java中的应用
1.Collection与Iterator接口
2.URL与URLConnection的应用
时序图如下:
十二、工厂方法模式的扩展
1.退化为简单工厂模式:一个模块尽需要一个工厂类,没有必要将它生产出来,直接使用静态的方法就可以。 2.Cache,一个对象使用完之后,并不需要立即释放,工厂类保持其状态,以便再次被使用。