最近在读设计模式之禅,今天主要分享一下工厂方法设计模式,这里对工厂方法设计模式做一个总结。
首先以女娲造人故事拉开帷幕,女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放到大地上生长,工艺过程没错,但是意外随时可能发生:
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.工厂方法模式是典型的解耦框架,高层模块需要知道产品的抽象类,其他的实现类都不用关心,符合迪米特法则,我们不需要交流,也符合依赖倒置原则,只依赖产品类的抽象,当然也符合里氏替换原则,使用产品子类替换父类产品父类。
工厂方法模式的缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,是的系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。