工厂方法:定义一个抽象对象接口,让子类决定实现哪个类。工厂方法使一个类的实例化延迟到其子类。
以雷锋工厂为例:
一、建立基本模式
//简单雷锋基本实现,有三项基本美德组成
class LeiFeng{
public void Sweep()
{
System.out.println("扫地");
}
public void Wash()
{
System.out.println("洗衣");
}
public void BuyRice()
{
System.out.println("买米");
}
}
//继承的是学生,设置学生类
class Undergraduate extends LeiFeng{
}
public class shh {
public static void main(String[] args) {
// TODO Auto-generated method stub
//
//客户端实现
LeiFeng st=new Undergraduate();
st.Sweep();
st.Wash();
st.BuyRice();
//如果有三个学生去做,分别定义
LeiFeng st1=new Undergraduate();
st1.Sweep();
LeiFeng st2=new Undergraduate();
st2.Wash();
LeiFeng st3=new Undergraduate();
st3.BuyRice();
}
这样一个简单的雷锋模式模式列出来了。
二、简单工厂的建立
//学生不可能一直做,所以需要社区志愿者
class Volunteer extends LeiFeng{
}
//这样就可以实现一个简单雷锋工厂
class SimpleFactory{
public static LeiFeng creatLeiFeng(String type) {
LeiFeng result=null;
switch(type) {
case "学雷锋的大学生":
result=new Undergraduate();
break;
case "社区志愿者":
result=new Volunteer();
break;
}
return result;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//简单工厂模式
LeiFeng stA=SimpleFactory.creatLeiFeng("学雷锋的学生");//可将其换成社区自愿者
stA.BuyRice();
LeiFeng stB=SimpleFactory.creatLeiFeng("学雷锋的学生");
stB.Sweep();
LeiFeng stC=SimpleFactory.creatLeiFeng("学雷锋的学生");
stC.Wash();
}
但是,这样就有一个明显的弊端,每次实例的时候都得写一次工厂的代码,重复,所以要进行进一步的优化。
三、工厂方法
//接口创立,让工厂可以多元化
interface IFactory{
LeiFeng creatLeiFeng();
}
//学生雷锋工厂
class UndergraduateFactory implements IFactory{
@Override
public LeiFeng creatLeiFeng() {
// TODO Auto-generated method stub
return new Undergraduate();
}
}
//志愿者雷锋工厂
class VolenteerFactory implements IFactory{
@Override
public LeiFeng creatLeiFeng() {
// TODO Auto-generated method stub
return new Volunteer();
}
}
public class shh {
public static void main(String[] args) {
// TODO Auto-generated method stub
IFactory factory=new UndergraduateFactory();//换成社区自愿者只需改这里即可
LeiFeng student=factory.creatLeiFeng();
student.BuyRice();
student.Sweep();
student.Wash();
}
节省代码,并且避免了重复的定义工厂,只需进行简单的改动。
至此,一个工厂方法实现完毕