简单工厂模式

这是第一发,我要立志记录一下我23种设计模式的学习记录,突然感觉如果写一个博客的话,那么我会记录的很清楚。

简单工厂原则的实质在于修改原来代码的时候不去修改其他方法的逻辑。

比如,我们写一个计算器,如果有一开始有一个加减乘除功能,现在需要一个开更号的功能,该怎么办?

如果按照没有学过设计模式的情况下,我们需要增加一个方法,在这个时候,因为这个方法是和原来的方法在一个类里面,所以我们修改的时候是可以修改原来的方法的。这样就有了不安全因素。所以说,我们应该让这些方法分离

举个例子,计算器。计算两个数的加减乘除功能

这个是操作类


public class Operation {
    public double getNumberA() {
        return NumberA;
    }

    public void setNumberA(double numberA){
        NumberA = numberA;
    }

    public double getNumberB() {
        return NumberB;
    }

    public void setNumberB(double numberB){
        NumberB = numberB;
    }

    protected double NumberA;
    protected double NumberB;

    public double GetResult(){
        double result = 0;
        return result;
    }
}

然后再来四个子类继承他,就是四个方法。


public class OperationAdd extends Operation{
    public double GetResult(){
        double result = 0;
        result = this.getNumberA() + this.getNumberB();
        return result;
    }
}

public class OperationDiv extends Operation{
    public double GetResult(){
        double result = 0;
        result = this.getNumberA() / this.getNumberB();
        return result;
    }
}

public class OperationMul extends Operation{
    public double GetResult(){
        double result = 0;
        result = this.getNumberA() * this.getNumberB();
        return result;
    }
}

public class OperationSub extends Operation{
    public double GetResult(){
        double result = 0;
        result = this.getNumberA() - this.getNumberB();
        return result;
    }
}

以上是业务逻辑,然后就是界面


import java.util.Scanner;

public class User {
    public static void main(String[] args){
            double numberA , numberB;
            String sign;
            Scanner cin = new Scanner(System.in);
            System.out.println("请输入数字A:");
            numberA = cin.nextDouble();
            System.out.print("请输入选择运算的符号'+','-','*','/'");
            sign = cin.next();//如果是nextline的情况下,会读上面的空格,导致异常。
            System.out.println("请输入数字B:");
            numberB = cin.nextDouble();
            Operation oper;
            oper = OperationFactory.createOperate("*");
            oper.setNumberA(numberA);
            oper.setNumberB(numberB);
            double result = oper.GetResult();
            System.out.println(result);
            System.out.println("hello");
    }
}

有一个这个,就是那个工厂类,他根据不同的参数,来控制生成哪一个类

这是工厂类,就是根据传进参数的不同,来控制生成的子类。


public class OperationFactory {
    public static Operation createOperate(String operate){
        double result = 0;
        Operation oper = null;
        switch(operate){
        case "+":
            oper = new OperationAdd();
            break;
        case "-":
            oper = new OperationSub();
            break;
        case "*":
            oper = new OperationMul();
            break;
        case "/":
            oper = new OperationDiv();
            break;
        }
        return oper;
    }
}

接着看那个

Operation oper
            oper = OperationFactory.createOperate("*");

这个是代码的精髓,生成的是一个子类,但是以父类的身份出现。
这样写的方法,就是因为函数是一个返回值,之前不生成一个类,不知道返回的时候赋什么值。所以一定要先生成,但是由于不知道返回的是哪一个子类,所以,写父类,让他们继承父类,就可以用父类来,让子类以父类身份出现。

子类以父类身份出现,这就是简单工厂模式的牛逼的地方。

内容概要:该论文探讨了一种基于粒子群优化(PSO)的STAR-RIS辅助NOMA无线通信网络优化方法。STAR-RIS作为一种新型可重构智能表面,能同时反射和传输信号,与传统仅能反射的RIS不同。结合NOMA技术,STAR-RIS可以提升覆盖范围、用户容量和频谱效率。针对STAR-RIS元素众多导致获取完整信道状态信息(CSI)开销大的问题,作者提出一种在不依赖完整CSI的情况下,联合优化功率分配、基站波束成形以及STAR-RIS的传输和反射波束成形向量的方法,以最大化总可实现速率并确保每个用户的最低速率要求。仿真结果显示,该方案优于STAR-RIS辅助的OMA系统。 适合人群:具备一定无线通信理论基础、对智能反射面技术和非正交多址接入技术感兴趣的科研人员和工程师。 使用场景及目标:①适用于希望深入了解STAR-RIS与NOMA结合的研究者;②为解决无线通信中频谱资源紧张、提高系统性能提供新的思路和技术手段;③帮助理解PSO算法在无线通信优化问题中的应用。 其他说明:文中提供了详细的Python代码实现,涵盖系统参数设置、信道建模、速率计算、目标函数定义、约束条件设定、主优化函数设计及结果可视化等环节,便于读者理解和复现实验结果。此外,文章还对比了PSO与其他优化算法(如DDPG)的区别,强调了PSO在不需要显式CSI估计方面的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值