Java 工厂模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 工厂模式相关的知识,希望对你有一定的参考价值。
有如下的一段代码:请问错在哪里?该怎么修改?
interface Fruit // 定义一个水果接口
public void eat() ; // 吃水果
class Apple implements Fruit
public void eat()
System.out.println("** 吃苹果。") ;
;
class Orange implements Fruit
public void eat()
System.out.println("** 吃橘子。") ;
;
class Factory // 定义工厂类
public static Fruit getInstance(String className)
Fruit f = null ;
if("apple".equals(className)) // 判断是否要的是苹果的子类
f = new Apple() ;
if("orange".equals(className)) // 判断是否要的是橘子的子类
f = new Orange() ;
return f ;
;
public class FactoryModel
public static void main(String args[])
Fruit f = Factory.getInstance(args[0]) ; // 实例化接口
if(f!=null) // 判断是否取得实例
f.eat() ;
;
public void eat(); // 吃水果
class Apple implements Fruit
public void eat()
System.out.println("** 吃苹果。");
;
class Orange implements Fruit
public void eat()
System.out.println("** 吃橘子。");
;
class Factory // 定义工厂类
private static Factory factory;
private Factory()
public static Factory getInstance()
if(factory==null)
factory=new Factory();
return factory;
public Apple newApplet()
return new Apple();
public Orange newOrange()
return new Orange();
;
class FactoryModel
public static void main(String args[])
Fruit f = Factory.getInstance().newApplet();
if (f != null) // 判断是否取得实例
f.eat();
f = Factory.getInstance().newOrange();
if (f != null) // 判断是否取得实例
f.eat();
; 参考技术A 定义工厂的时候出错,因为工厂是要生产东西的,那么肯定是需要先生成一个实例:public static FruitFactory getInstance()里面具体实现,自己写,而不是返回Fruit这个类。工厂实例化后,就要开始生产了,那么就定义两个个生产的方法
public Fruit produceOrange()
return new Orange();
public Fruit produceApple()
return new Apple();
public Fruit produce(String className)
Fruit f = null;
if("apple".equals(className)) // 判断是否要的是苹果的子类
f = new Apple() ;
if("orange".equals(className)) // 判断是否要的是橘子的子类
f = new Orange() ;
return f ;
__________________________
然后就是具体的实现拉,不过这种简单工厂的实现,会有很多问题就是。
public static void main(String[] args)
FruitFactory.getInstance().produceOrange().eat();
FruitFactory.getInstance().produce("Orange").eat()
java工厂模式
java工厂模式分三种:简单工厂模式、工厂方法模式、抽象工厂模式。
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
简单工厂模式就是通过一个"全能类",根据外界传递的信息来决定创建哪个具体类的对象。如下图(懒得写demo了,知乎上截了一个。):
通过一个简单工厂类,根据name创建相应的产品对象。
关于简单类如过还有不明白,更多的资料可以参考http://blog.csdn.net/weiwenlongll/article/details/6918164。
简单工厂模式严重违背了“开闭原则”,难以拓展,由此产生了工厂方法模式。
工厂方法模式(FACTORY METHOD)是对简单工厂模式进行了抽象化,符合“开闭原则”,实现了可扩展。
工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
工厂方法模式使用场景:
如组装手机的代工厂。从手机原料工厂获取外壳、显示屏、主板、按键、电池等配件进行组装。组装手机工厂只负责手机的装配,而不负责配件的生产,也不需要关心从手机原料工厂出来的配件是否改变,只要手机各个配置衔接的接口不变就行。比如原料工厂显示屏从TFT 的换成了UFB的显示屏,对于组装手机的代工厂来说,只要接口没变,只需要继续装配就行。
如下图,首先建立一个原料工厂接口,原料工厂接口分别定义了创建外壳、显示屏、主板、电池的方法。
LB手机原料工厂负责提供LB手机需要的配件,电池、TFT显示屏、主板、皮革外壳。
下面是手机装配厂的接口,装配厂只负责从原料工厂获取配件并装配成新的手机,其他的概不负责。
LB手机装配厂,负责装配LB原料工厂提供的配件。当然,偶尔也接接私活,装配其它手机厂的手机。
LB手机销量很火,在全国各地都有了装配厂。有一天LB手机的屏幕突然要进行更换了,从TFT显示屏变更成UFT显示屏。牵一发而动全身,这时候就体现出了工厂方法模式的好处。无论LB手机的配置如何变更,对于装配厂来说,createDisplay()接口依然不变。这样只需要原材料工厂的显示屏从提供TFT显示屏更换为UFT显示屏就行。
工厂模式的好处就在于提供创建的产品接口给使用者就行,无论产品的类型如何变化,只要根据接口创建的产品的功能没有变化,使用者就无须做任何变动。
很多介绍工厂方法模式的都是将工厂模式的用法列出来,而并没有具体介绍何时使用。初看时觉得工厂方法模式属于多余,增加了繁杂性,后来慢慢熟悉了工厂方法模式的用处,又重新翻阅了一遍《Head First Design Patterns》巩固一下。特模拟一个场景结合理论记录下来,希望能巩固理解。
以上是关于Java 工厂模式的主要内容,如果未能解决你的问题,请参考以下文章