工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。
(1)普通工厂模式
接口类,用于定义总的类型
public interface Human
{
//每个人种的皮肤都有相应的颜色
public void getColor();
//人类会说话
public void talk();
}
人类的三种子类型
public class WhiteHuman implements Human
{
@Override
public void getColor()
{
System.out.println("白种人白色皮肤");
}
@Override
public void talk()
{
System.out.println("白种人说英语");
}
}
public class BlackHuman implements Human
{
@Override
public void getColor()
{
System.out.println("黑种人黑色皮肤");
}
@Override
public void talk()
{
System.out.println("黑种人说印度语");
}
}
public class YellowHuman implements Human
{
@Override
public void getColor()
{
System.out.println("黄种人黄色皮肤");
}
@Override
public void talk()
{
System.out.println("黄种人说汉语");
}
}
工厂类的抽象类
public abstract class AbstractHumanFactory
{
public abstract <T extends Human> T createHuman(Class<T> clazz);
}
工厂类的实现类
public class HumanFactory extends AbstractHumanFactory
{
@Override
public <T extends Human> T createHuman(Class<T> clazz)
{ Human human = null;
try
{
human = (Human)Class.forName(clazz.getName()).newInstance();
}
catch (Exception e)
{
//处理异常
}
return (T)human;
}
}
工厂类的使用场景,工厂类不负责管理创建类的类型,只根据参数来生成对应类的实例。
public class NvWa
{
public static void main(String[] args)
{
AbstractHumanFactory humanFactory = new HumanFactory();
//创建一个WhiteHuman实例
Human whiteHuman = humanFactory.createHuman(WhiteHuman.class);
whiteHuman.getColor();
whiteHuman.talk();
//创建一个BlackHuman实例
Human blackHuman = humanFactory.createHuman(BlackHuman.class);
blackHuman.getColor();
blackHuman.talk();
//创建一个YellowHuman实例
Human yellowHuman = humanFactory.createHuman(YellowHuman.class);
yellowHuman.getColor();
yellowHuman.talk();
}
}
(2)工厂模式简化版
工厂模式的简化版,不使用工厂抽象类,直接使用静态方法来创建一个实例;去除AbstractHumanFactory.java,并对HumanFactory.java和NvWa.java做了简单的修改,代码如下。
工厂实现类
public class HumanFactory
{
public static <T extends Human> T createHuman(Class<T> clazz)
{ Human human = null;
try
{
human = (Human)Class.forName(clazz.getName()).newInstance();
}
catch (Exception e)
{
//处理异常
}
return (T)human;
}
}
使用场景类
public class NvWa
{
public static void main(String[] args)
{
//创建一个WhiteHuman实例
Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);
whiteHuman.getColor();
whiteHuman.talk();
//创建一个BlackHuman实例
Human blackHuman = HumanFactory.createHuman(BlackHuman.class);
blackHuman.getColor();
blackHuman.talk();
//创建一个YellowHuman实例
Human yellowHuman = HumanFactory.createHuman(YellowHuman.class);
yellowHuman.getColor();
yellowHuman.talk();
}
}
(3)升级为多个工厂类
在复杂的项目中,某一个父类的所有实例化都各有不同,若只让一个工厂类去实例化,会让工厂类过于复杂,不利于项目维护;可以对子类构建专门的实例化工厂类。
一下代码中,为每个Human接口实现类都构建了一个实例化工厂类;不同接口实现类由不同工厂类实例化。
AbstractHumanFactory.java 做修改
public abstract class AbstractHumanFactory
{
public abstract Human createHuman();
}
创建三个专门的工厂类进行不同子类的实例化工作
public class WhiteHumanFactory extends AbstractHumanFactory
{
@Override
public Human createHuman()
{
return new WhiteHuman();
}
}
public class BlackHumanFactory extends AbstractHumanFactory
{
@Override
public Human createHuman()
{
return new BlackHuman();
}
}
public class YellowHumanFactory extends AbstractHumanFactory
{
@Override
public Human createHuman()
{
return new YellowHuman();
}
}
(4)生产单例的工厂模式(待续)