工厂方法模式-大话设计模式
创始人
2025-06-01 01:05:32

一、概念

工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。

抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。

抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。

具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专

门的具体工厂创建,它们之间往往一一对应。

二、代码实现

 

 

 

需求:显示两个数的计算(加、减、乘除、次方、方根)

抽象工厂:


public interface IFactory {public Operation createOperation(String operate);
}

具体工厂:

public class OperationFactory {public static Operation createOperate(String operate) {Operation oper = null;IFactory factory = null;switch (operate) {case "+":case "-":case "*":case "/":factory = new FactoryBasic();break;case "pow":case "log":factory=new FactoryAdvanced();}oper = factory.createOperation(operate);return oper;}}public class FactoryBasic implements IFactory{@Overridepublic Operation createOperation(String operate) {Operation oper = null;switch (operate) {case "+":oper = new Add();break;case "-":oper = new Sub();break;case "*":oper = new Mul();break;case "/":oper = new Div();break;}return oper;}
}
public class FactoryAdvanced implements IFactory{@Overridepublic Operation createOperation(String operate) {Operation oper = null;switch (operate) {case "pow":oper = new Pow();break;case "log":oper = new Log();break;}return oper;}
}

抽象产品:

public abstract class Operation {public abstract double getResult(double numberA,double numberB);
}

具体产品:

public class Add extends Operation {@Overridepublic double getResult(double numberA, double numberB) {return numberA+numberB;}
}
public class Div extends Operation {@Overridepublic double getResult(double numberA, double numberB) {if (numberB==0) {throw  new ArithmeticException();}return numberA/numberB;}
}
public class Log extends Operation {@Overridepublic double getResult(double numberA, double numberB) {return Math.log(numberB)/Math.log(numberA);}
}
public class Mul extends Operation {@Overridepublic double getResult(double numberA, double numberB) {return numberA*numberB;}
}
public class Pow extends Operation {@Overridepublic double getResult(double numberA, double numberB) {return Math.pow(numberA,numberB);}
}
public class Sub extends Operation {@Overridepublic double getResult(double numberA, double numberB) {return numberA-numberB;}
}

测试:

  public static void main(String[] args) {Operation log = OperationFactory.createOperate("pow");System.out.println(log.getResult(10, 2));}

相关内容

热门资讯

美团歪马送酒年销超60亿 根据美团歪马送酒城市营运负责人最近于一场论坛分享的数据,美团自营的酒品前置仓小时达到家业务——歪马送...
股价长期低迷,投资者再对郑州银... 出品|达摩财经上市银行股中期分红密集发放,郑州银行(002936.SZ)的分红问题再度被投资者提及。...
长安银行12亿存款失踪,终于开... 围绕“长安银行12亿元协议存款失踪”的优策投资案,在沉寂一年多后迎来关键节点。监管重罚落地、刑事线索...
第140期:50.50 2025年12月12日更新:【#大V综合信号#】50.50不买不卖(上期50.55)
生死大疆,大疆大战前员工 订阅 快刀财经 ▲ 做您的私人商学院生、死、大疆。当大疆压境,进入你开拓的新市场,你怎么办?作者:一...