工厂方法模式

来源:互联网 发布:平面设计和淘宝美工 编辑:程序博客网 时间:2024/06/14 06:11

  最近在读设计模式之禅,今天主要分享一下工厂方法设计模式,这里对工厂方法设计模式做一个总结。
  首先以女娲造人故事拉开帷幕,女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放到大地上生长,工艺过程没错,但是意外随时可能发生:
  1.第一次拷泥人,感觉应该熟了,往大地一放,哇,没烤熟!于是一个白人诞生了!
  2.第二次拷泥人,上一次没有烤熟,这次多烤一会,放到世间一看,嘿,熟过头了,于是黑人诞生了!
  3.第三次拷泥人,一边烧制一边查看,直到表皮微黄,嘿,刚刚好,于是黄种人出现了!
  以上述女娲造人过程来分析,该过程涉及到3个对象:女娲,八卦炉,三种不同肤色的人。我们可以把女娲当做类Client来表示,八卦炉类似工厂,人类看作产品来模拟工厂方法模式。
  定义抽象产品(人类)Human类

public interface Human{        //获取人的肤色        public void getColor();        //人类交流        public void talk();}

  定义具体产品类:
  (黑人)BlackHuman类

public class BlackHuman implements Human{    @Override    public void getColor()    {        // TODO Auto-generated method stub            System.out.println("黑人的肤色是黑色的");    }    @Override    public void talk()    {        // TODO Auto-generated method stub        System.out.println("黑人讲话听不懂");    }}

  (黄种人)YellowHuman类

public class YellowHuman implements Human{    @Override    public void getColor()    {        // TODO Auto-generated method stub            System.out.println("黄种人的肤色是黄色的");    }    @Override    public void talk()    {        // TODO Auto-generated method stub        System.out.println("黄种人很多讲汉语");    }}

  (白人)WhiteHuman类

public class WhiteHuman implements Human{    @Override    public void getColor()    {        // TODO Auto-generated method stub            System.out.println("白人的肤色是白色的");    }    @Override    public void talk()    {        // TODO Auto-generated method stub        System.out.println("白人很多讲英语");    }}

  定义抽象工厂类AbstractHumanFatory

public abstract class AbstractHumanFatory{    public abstract <T extends Human> T createHuman(Class<T> cl);}

  定义具体工厂类(八卦炉)HumanFactory :

public class HumanFactory extends AbstractHumanFatory{    @SuppressWarnings("unchecked")    @Override    public <T extends Human> T createHuman(Class<T> cl)    {        // TODO Auto-generated method stub        Human human = null;        try{            human = (T)Class.forName(cl.getName()).newInstance();        }catch(Exception e)        {            System.out.println("造人失败");        }        return (T)human;    }}

  定义场景类(女娲)NvWa类

public class NvWa{    public static void main(String[] args)    {        //八卦炉        AbstractHumanFatory bagualu  = new HumanFactory();        //开始造白人        System.out.println("=============开始造白人===============");        Human whiteHuman = bagualu.createHuman(WhiteHuman.class);        whiteHuman.getColor();        whiteHuman.talk();        //开始造黄人        System.out.println("=============开始造黄人===============");        Human yellowHuman = bagualu.createHuman(YellowHuman.class);        yellowHuman.getColor();        yellowHuman.talk();        //开始造黑人        System.out.println("=============开始造黑人===============");        Human blackHuman = bagualu.createHuman(BlackHuman.class);        blackHuman.getColor();        blackHuman.talk();    }}

  女娲造人场景运行结果:

=============开始造白人===============白人的肤色是白色的白人很多讲英语=============开始造黄人===============黄种人的肤色是黄色的黄种人很多讲汉语=============开始造黑人===============黑人的肤色是黑色的黑人讲话听不懂

以上就是工厂方法模式。

工厂方法模式定义

  工厂方法模式定义:Define an interface for creating an object,but let subclasses decide which class to instantiate Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法是一个类的实例化延迟到其子类)。
  在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;Factory为抽象工厂类,具体如何创建产品有具体的实现工厂ConcreteFactory来完成。
  
工厂方法模式的优点:

  1.良好的封装性,代码结构清晰,调用者需要一个具体产品对象,只需要知道这个产品类的类名就可以,不用知道如何具体创建的。
  2.工厂方法模式扩展性优秀,增加产品类只要扩展一个工厂类就可。
  3.屏蔽产品类,产品的实现如何变化,调用者并不需要关心,他只需要关心产品的接口。
  4.工厂方法模式是典型的解耦框架,高层模块需要知道产品的抽象类,其他的实现类都不用关心,符合迪米特法则,我们不需要交流,也符合依赖倒置原则,只依赖产品类的抽象,当然也符合里氏替换原则,使用产品子类替换父类产品父类。
  
工厂方法模式的缺点

  每次增加一个产品时,都需要增加一个具体类和对象实现工厂,是的系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

0 0
原创粉丝点击