java中23种设计模式之1-工厂方法模式(factory method pattern)

   FactoryMethod是一种创建性模式,它定义了一个创建对象的接口,但是却让子类来决定具体实例化哪一个类.当一个类无法预料要创建哪种类的对象或是一个类需要由子类来指定创建的对象时我们就需要用到Factory Method 模式了。

工厂方法模式的好处:

   首先,良好的封装性,代码结构清晰。一个对象创建是有条件约束的,如一个调用者需要一个具体的产品对象,只要知道这个产品的类名(或约束字符串)就可以了,不用知道创建对象的艰辛过程,减少模块间的耦合。

   其次,工厂方法模式的扩展性非常优秀。在增加产品类的情况下,只要适当地修改具体的工厂类或扩展一个工厂类。

   再次,屏蔽产品类。这一特点非常重要,产品类的实现如何变化,调用者都不需要关心,它只需要关心产品的接口,只要接口保持不表,系统中的上层模块就不要发生变化,因为产品类的实例化工作是由工厂类负责,一个产品对象具体由哪一个产品生成是由工厂类决定的。在数据库开发中,大家应该能够深刻体会到工厂方法模式的好处:如果使用JDBC连接数据库,数据库从MySql切换到Oracle,需要改动地方就是切换一下驱动名称(前提条件是SQL语句是标准语句),其他的都不需要修改,这是工厂方法模式灵活性的一个直接案例。

  最后,工厂方法模式是典型的解耦框架。高层模块值需要知道产品的抽象类,其他的实现类都不用关心,符合迪米特原则,我不需要的就不要去交流;也符合依赖倒转原则,只依赖产品类的抽象;当然也符合里氏替换原则,使用产品子类替换产品父类,没问题!

 

例如当程序中有100个地方需要通过带参NEW一个对象的时候,后续如果对象的构造参数发生了改变,那么就要在100个地方做修改。

采用工厂方法后,只需要修改工厂方法里的NEW方法,100个地方调用工厂方法去生产对象并不需要做修改。

 

 

首先介绍简单工厂模式,简单工厂模式有3个要素:产品接口,产品实现,工厂类。如下代码,可以看出简单工厂模式的缺点是一旦产品过多,会造成工厂类的庞大。

 

interface IEat{
public void eat();
}

class ChineseMan implements IEat{
public void eat(){
System.out.println("chineseman eat rice and flour");
}
}

class UsaMan implements IEat{
public void eat(){
System.out.println("usaman eat potato");
}
}

class JapaneseMan implements IEat{
public void eat(){
System.out.println("japaneseman eat shit");
}
}

class HumanFactory{
public static IEat produceChineseMan(){
return new ChineseMan();
}
public static IEat produceUsaMan(){
return new UsaMan();
}
public static IEat produceJapaneseMan(){
return new JapaneseMan();
}
}
public class SimpleFactoryPattern{
public static void main(String[] args){
HumanFactory aHumanFactory=new HumanFactory();
IEat chineseEat=aHumanFactory.produceChineseMan();
chineseEat.eat();
IEat usaEat=aHumanFactory.produceUsaMan();
usaEat.eat();
IEat japaneseEat=aHumanFactory.produceJapaneseMan();
japaneseEat.eat();

IEat chineseEat2=HumanFactory.produceChineseMan();
chineseEat2.eat();
}
}

**********************************************

输出结果:

chineseman eat rice and flour
usaman eat potato
japaneseman eat shit
chineseman eat rice and flour

 

工厂方法模式对简单工厂模式做了一些优化,把工厂类分成了工厂接口和工厂实现,也就是说,工厂方法模式有4个要素:产品接口,产品实现,工厂接口,工厂实现。

 

interface IEat{
public void eat();
}

class ChineseMan implements IEat{
public void eat(){
System.out.println("chineseman eat rice and flour");
}
}

class UsaMan implements IEat{
public void eat(){
System.out.println("usaman eat potato");
}
}

class JapaneseMan implements IEat{
public void eat(){
System.out.println("japaneseman eat shit");
}
}
interface IFactory{
public IEat produceMan();
}
class ChineseManFactory implements IFactory{
public IEat produceMan(){
return new ChineseMan();
}
}
class UsaManFactory implements IFactory{
public IEat produceMan(){
return new UsaMan();
}
}
class JapaneseManFactory implements IFactory{
public IEat produceMan(){
return new JapaneseMan();
}
}

public class FactoryMethodPattern{
public static void main(String[] args){
IFactory aIFactory=new ChineseManFactory();
IEat chineseEat=aIFactory.produceMan();
chineseEat.eat();

aIFactory=new UsaManFactory();
IEat usaEat=aIFactory.produceMan();
usaEat.eat();

aIFactory=new JapaneseManFactory();
IEat japaneseEat=aIFactory.produceMan();
japaneseEat.eat();
}
}

************************

输出结果:

chineseman eat rice and flour
usaman eat potato
japaneseman eat shit

///////////////////////////////////////////////////////////////////////////////////////////

以生产手机为例:简单工厂模式就是一家工厂可以生产各种品牌手机(山寨的)。 工厂方法模式就是有多家工厂,每家工厂只生产自己品牌的手机。

 

posted on 2015-03-25 21:55  wudymand  阅读(205)  评论(0编辑  收藏  举报

导航