
本文共 2764 字,大约阅读时间需要 9 分钟。
工厂方法模式(Factory Method)是一种经典的设计模式,用于将对象的创建athorized推迟到子类或者某一外部机制,从而松散coupled对象与其创建逻辑。这种模式的核心思想是定义一个用于创建对象的接口,具体实例由各个子类去实现,从而遵循"开放-封闭原则",既能扩展,又能保持开闭的状态。
简单工厂模式虽然实现了类的静态工厂方法,能够通过装饰着者模式实现缺省值的功能,但其存在一个明显缺陷:如果需要增加新的类,必然需要修改工厂接口及其实现类的方法,这违背了"开放-封闭原则"。工厂方法模式则解决了这一问题,它将简单工厂的内部逻辑判断转移到客户端代码中进行,更灵活地遵循"开放-封闭原则"。
工厂方法模式不仅能够满足基本的工厂功能,还可以通过抽象工厂和多个具体工厂的结合,实现更高层次的工厂逻辑。这种模式在大型应用系统中表现优异,因为它能够在保持系统对变化的灵活性和适应性的同时,降低对单个工厂类的过度依赖。
接下来的示例将帮助你更好地理解工厂方法模式的实现方式。假设我们有一个需要创建不同类型的"雷锋"类(LeiFeng)的场景,每个类有不同的工作任务。我们可以通过工厂模式来实现这些类的创建。
** LeiFeng 类及其子类定义**:
public interface LeiFeng { void sweep(); void wash(); void buyRice();}public abstract class LeiFong { protected LeiFong(String name) { //初始化 } //抽象方法,具体由子类实现 public abstract void sweep(); public abstract void wash(); public abstract void buyRice();}
** Leifong工厂接口**:
public interface IFactory { LeiFong createLeiFong();}
具体工厂实现:
public class UndergraduateFactory implements IFactory { @Override public LeiFong createLeiFong() { return new Undergraduate(); }}public class VolunteerFactory implements IFactory { @Override public LeiFong createLeiFong() { return new Volunteer(); }}
具体产品实现:
public class Undergraduate extends LeiFong { public Undergraduate(String name) { super(name); System.out.println("大学生雷锋被创建"); } @Override public void sweep() { System.out.println("大学生雷锋帮忙扫地"); } @Override public void wash() { System.out.println("大学生雷锋帮忙洗衣"); } @Override public void buyRice() { System.out.println("大学生雷锋帮忙买米"); }}public class Volunteer extends LeiFong { public Volunteer(String name) { super(name); System.out.println("社区志愿者雷锋被创建"); } @Override public void sweep() { System.out.println("社区志愿者帮忙扫地"); } @Override public void wash() { System.out.println("社区志愿者帮忙洗衣"); } @Override public void buyRice() { System.out.println("社区志愿者帮忙买米"); }}
客户端代码(Main类):
public class Client { public static void main(String[] args) { //创建大学生雷锋 IFactory undergraduateFactory = new UndergraduateFactory(); LeiFong student = undergraduateFactory.createLeiFong(); student.sweep(); student.wash(); student.buyRice(); //创建社区志愿者 IFactory volunteerFactory = new VolunteerFactory(); LeiFong volunteer = volunteerFactory.createLeiFong(); volunteer.sweep(); volunteer.wash(); volunteer.buyRice(); }}
在工厂方法模式中,抽象工厂 creataLeiFong()方法返回一个 LeiFong 实例。通过这种方式,每个具体工厂可以选择返回不同的子类实例,从而实现系统的灵活性和可扩展性。此外,这种设计使得客户端代码仅需关注对象的使用,而无需直接参与对象的创建过程,这种方式更符合面向接口的设计原则。在实际应用中,可以通过动态加载或配置文件等方式注册新的工厂类,从而无需修改现有的工厂接口。
发表评论
最新留言
关于作者
