什么是工厂方法模式
工厂方法模式是类的创建模式,其用意是定义一个用于创建产品对象的工厂的接口,而将实际创建工作推迟到工厂接口的子类中。它属于简单工厂模式的进一步抽象和推广。多态的使用,使得工厂方法模式保持了简单工厂模式的特点,而且克服了它的缺点。
工厂方法模式的设计类如下所示

Product为产品的接口或基类,所有产品都实现这个接口或抽象类(例如ContextProduct),这样就可以在运行时根据需求创建对应的产品类。Creator实现了对产品的所有操作方法,而不实现产品对象的实例化。产品的实例化由Creator的子类来完成。
工厂方法模式代码实现
我们以一位同学的代码为例
- 抽象产品角色:
package FactoryMethodPattern;
//雷锋
public abstract class LeiFeng {
public abstract void Sweep();
public abstract void Wash();
public abstract void BuyRice();
}
- 具体产品角色:
package FactoryMethodPattern;
//社区志愿者
public class Volunteer extends LeiFeng {
@Override
public void Sweep() {
System.out.print("社区志愿者帮忙打扫 ");
}
@Override
public void Wash() {
System.out.print("社区志愿者帮忙洗衣服 ");
}
@Override
public void BuyRice() {
System.out.print("社区志愿者帮忙买米 ");
}
}
//学雷锋的大学生
class Undergraduate extends LeiFeng {
@Override
public void Sweep() {
System.out.print("大学生帮忙打扫 ");
}
@Override
public void Wash() {
System.out.print("大学生帮忙洗衣服 ");
}
@Override
public void BuyRice() {
System.out.print("大学生帮忙买米 ");
}
}
- 抽象工厂角色:
package FactoryMethodPattern;
//雷锋工厂
public interface IFactory {
LeiFeng CreateLeiFeng();
}
- 具体工厂角色:
package FactoryMethodPattern;
//社区志愿者工厂
public class VolunteerFactory implements IFactory {
@Override
public LeiFeng CreateLeiFeng() {
return new Volunteer();
}
}
//学雷锋的大学生工厂
class UndergraduateFactory implements IFactory {
@Override
public LeiFeng CreateLeiFeng() {
return new Undergraduate();
}
}
- 客户端测试代码:
package FactoryMethodPattern;
public class Test {
public static void main(String[] args) {
//要换成'社区志愿者',修改这里就可以
IFactory factory = new UndergraduateFactory();
LeiFeng student = factory.CreateLeiFeng();
student.Sweep();
student.Wash();
student.BuyRice();
System.out.println("\n --------------------------");
IFactory factory2 = new VolunteerFactory();
LeiFeng volunteer = factory2.CreateLeiFeng();
volunteer.Sweep();
volunteer.Wash();
volunteer.BuyRice();
}
}
本文深入讲解工厂方法模式,一种常见的类创建模式。通过定义产品对象的工厂接口,并将实际创建工作延迟到子类,实现了多态性和灵活性。文章通过具体代码示例展示了抽象产品、具体产品、抽象工厂和具体工厂的角色及其实现。

被折叠的 条评论
为什么被折叠?



