工厂方法模式

  最近在读设计模式之禅,今天主要分享一下工厂方法设计模式,这里对工厂方法设计模式做一个总结。
  首先以女娲造人故事拉开帷幕,女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放到大地上生长,工艺过程没错,但是意外随时可能发生:
  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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值