设计模式-02-工厂方法模式的剖析

时间:2022-10-02 15:45:20

设计模式-02-工厂方法模式的剖析


本文主要参见自《Java与模式》另外还有《设计模式之禅》 一、定义
1.将实际创建工作推迟到工厂接口的子类中。

二、简单工厂的优缺点
1.开闭原则支持的不够:客户端支持开闭原则,但是工厂本身不支持开闭原则。如果有新的产品过来,就需要相应的修改工厂类。

三、工厂方法模式的引进
1.工厂方法模式是简单工厂模式的进一步抽象和改进,工厂模式克服了简单工厂开比原则支持不够的问题。 2.核心的工厂类,不再负责所有产品的创建,将具体的创建工作交给子类,核心类变成了抽象工厂角色。 3.允许在不修改具体工厂角色的情况下引入新的产品。 4.通常首先有产品角色,然后有工厂角色,也就是说,通常按照产品的等级结构设计一个同结构的工厂等级结构。

五、UML图
1.类图
设计模式-02-工厂方法模式的剖析
2.时序图 设计模式-02-工厂方法模式的剖析
六、角色
1.抽象工厂类 2.具体工厂类 3.抽象产品类 4.具体产品类
七、code实现 1.抽象工厂类
package com.jue.dp;

public interface IFactory {

IProduct newInstance();
}
2.具体工厂类

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();
}

}

3.抽象产品类

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接口
设计模式-02-工厂方法模式的剖析
2.URL与URLConnection的应用
设计模式-02-工厂方法模式的剖析
时序图如下:
设计模式-02-工厂方法模式的剖析

十二、工厂方法模式的扩展
1.退化为简单工厂模式:一个模块尽需要一个工厂类,没有必要将它生产出来,直接使用静态的方法就可以。 2.Cache,一个对象使用完之后,并不需要立即释放,工厂类保持其状态,以便再次被使用。