之前有一篇简单工厂模式的介绍:http://liyf155.iteye.com/blog/1180975,里面介绍了简单工厂模式。简单工厂模式的缺点是很明显的,对“开-闭”原则的支持不够,即扩展性不好,如果有新的产品加入到系统中,那么就要去修改工厂类,并且将必要的逻辑加入到工厂类中,工厂方法模式的引进,既保留了简单工厂模式的有点,又克服了它的缺点。
首先,在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变成了一个抽象工厂角色,仅负责给出子类需要实现得接口,而不用关心具体的实现细节。
这种进一步抽象化得结果,使这种工厂方法模式可以用来允许系统在不修改具体工厂角色的情况下引进新的产品,这一特点无疑使得工厂方法模式具有超过简单工厂模式的优越性。
下面给出一个例子:、
package factorymethod;
// 水果类接口
public interface FruitFactory
{
void grow();
void havest();
void plant();
}
package factorymethod;
// 园丁类接口,依赖水果类接口
public interface FruitGardener
{
FruitFactory generate();
}
package factorymethod;
public class AppleGardener implements FruitGardener
{
public FruitFactory generate()
{
return new Apple();
}
}
package factorymethod;
public class GrapeGardener implements FruitGardener
{
public FruitFactory generate()
{
return new Grape();
}
}
package factorymethod;
public class OrangeGardener implements FruitGardener
{
public FruitFactory generate()
{
return new Orange();
}
}
package factorymethod;
public class Apple implements FruitFactory
{
public void grow()
{
System.out.println("Apple growing......");
}
public void havest()
{
System.out.println("Apple havested......");
}
public void plant()
{
System.out.println("Apple planted......");
}
}
package factorymethod;
public class Orange implements FruitFactory
{
public void grow()
{
System.out.println("Orange growing......");
}
public void havest()
{
System.out.println("Orange havested......");
}
public void plant()
{
System.out.println("Orange planted......");
}
}
package factorymethod;
public class Grape implements FruitFactory
{
public void grow()
{
System.out.println("Grape growing......");
}
public void havest()
{
System.out.println("Grape havested......");
}
public void plant()
{
System.out.println("Grape planted......");
}
}
package factorymethod;
public class Test
{
public static void main(String[] args)
{
FruitGardener appleGardener = new AppleGardener();
FruitGardener orangeGardener = new OrangeGardener();
FruitGardener grapeGardener = new GrapeGardener();
FruitFactory fruit = appleGardener.generate();
fruit.plant();
fruit.grow();
fruit.havest();
System.out.println("***************************");
fruit = orangeGardener.generate();
fruit.plant();
fruit.grow();
fruit.havest();
System.out.println("***************************");
fruit = grapeGardener.generate();
fruit.plant();
fruit.grow();
fruit.havest();
}
}
从代码中分析可以看出,FruitGardener这个抽象工厂类依赖FruitFactory这个抽象产品类,这两个类只是定义了需要被子类实现的方法而已,而子类具体要怎么实现可以不管。当系统需要添加一个新的产品,比如说Banana香蕉,那么只要一个BananaGardener实现FruitGardener接口,Banana实现FruitFactory接口,就实现了系统的扩展功能。
分享到:
相关推荐
介绍的是工厂模式 包括简单工厂模式、工厂方法模式、抽象工厂模式 包括PPT和代码
java设计模式 工厂方法模式uml类图,一张图就让你秒懂工厂方法模式
工厂方法模式工厂方法模式工厂方法模式工厂方法模式工厂方法模式
工厂方法模式和抽象工厂模式的区别,对工厂方法模式和抽象工厂模式做了简单的比较
在简单工厂模式中,所有的产品都是由同一个工厂创建,工厂类职责较重,业务逻辑较为复杂,具体产品与工厂类之间的耦合度高,严重影响了系统的灵活性和扩展性,而工厂方法模式则可以很好地解决这一问题。
设计一个程序来读取多种不同存储格式的图片,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF格式图片读取器(GifReader)用于读取...请使用工厂方法模式实现该程序的设计,并使用UML画出该模式的类图。
工厂方法模式的C语言实现。改写自http://blog.csdn.net/sx_wpc/article/details/7645062一文的代码。
深入浅出设计模式之抽象工厂模式+工厂方法模式+策略模式实现手机加工厂(加类图)
设计模式,工厂方法模式源文件,基本源代码
工厂方法模式Demo
java工厂方法模式 java工厂方法模式java工厂方法模式java工厂方法模式java工厂方法模式java工厂方法模式
工厂方法模式[C#]工厂方法模式[C#]
工厂方法模式,主要是利用反射机制获取配置文件的信息,用户可以在不知道如何生产对象的情况下获取对象。包括源代码和文档(文档在本博客的文档说明中)。
IOS 工厂方法模式代码Demo IOS 工厂 方法 模式 设计
设计模式 c# 工厂方法模式
用工厂方法模式重构简易计算器。界面要求:模仿windows操作系统附件中的计算器样式进行设计,要设计基本的菜单项(快捷键、热键、和分割线等)。功能要求:实现基本计算功能
初学者适用,工厂方法模式的Java示例程序,已打包为VS2005的J#工程。
工厂方法模式和简单工厂模式在结构上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而...
这个是http://blog.csdn.net/dawanganban/article/details/9877593博客中java设计模式的源代码。下载前请先看《设计模式——工厂方法模式》一文。
本文章通俗易懂的对工厂模式进行了讲解,相信您看完这篇文章会对工厂模式有更深入的了解