大话设计模式-简单工厂模式(学习笔记与java实现)

java学习了一段时间,对面向对象有一定的理解,但是总觉得理解不深,这几天开始看设计模式,用的是程杰的大话设计模式,但是书里的源码是C#的,自己用java来实现,也加深了java的学习。
1、简单工厂模式的定义
提供一个创建对象实例的功能,不关心它的具体实现。被创建实例的类型可以使接口、抽象类,也可以是具体的类。
2、简单工厂本质
简单工厂模式的本质就是:选择实现。重点在于选择,无论多简单,都要由具体的实现类来实现,而不能在简单工厂里实现。简单工厂的目的在于为客户端选择相应的实现,从而使得客户端和实现解耦。这样以来,无论具体实现发生什么变化,不用变动客户端,这种变化由简单工厂模式屏蔽掉。
3、何时选择简单工厂
如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选用简单工厂,让客户端通过工厂来获取相应的接口,而无需关心具体的实现。
如果想要把对外创建对象的职责集中管理和控制,可以选用简单工厂,一个很简单工厂可以创建很多的、不相关的对象,可以把对外创建对象的职责集中到一个简单工厂来,从而实现集中管理和控制。
4、简单工厂模式的优点和缺点
优点:工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。

缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;这些缺点在工厂方法模式中得到了一定的克服。

/*Client.java   简单计算器的客户端    */
package Test1;

import java.io.Console;
import java.io.PrintWriter;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) {
        Operation result=null;
        Scanner scin=new Scanner(System.in);    
                try {
                    System.out.print("请输入数字A: ");
                    double NumA=scin.nextDouble();
                    System.out.print("请输入运算符(+、-、*、/): ");
                    String strOperate=scin.next();
                    System.out.print("请输入数字B: ");
                    double NumB=scin.nextDouble();
                    result=OperationFactory.createOperate(strOperate);
                    result.setA(NumA);
                    result.setB(NumB);
                    System.out.println("结果是: "+result.getResult());
                } catch (Exception e) {
                    System.out.println("您输入有错: "+e);
            }

    }

}
/*计算部分的超类*/
package Test1;

public class Operation {
    protected double numberA=0;
    protected double numberB=0;

        double getA()
        {
            return numberA;
        }
        double setA(double value)
        {
            this.numberA=value;
            return numberA;
        }


        double getB()
        {
            return numberB;
        }
        double setB(double value)
        {
            this.numberB=value;
            return numberB;
        }
    public double getResult()
    {
        double result=0;
        return result;
    }
}

`public class OperationAdd extends Operation{
public double getResult()
{
double result=0;
result=numberA+numberB;
return result;
}

}
package Test1;

public class OperationDiv extends Operation{
public double getResult(double numberA,double numberB)
{
double result=0;
if(numberB==0)
try {
throw new Exception(“除数不能是0.”);
} catch (Exception e) {
e.printStackTrace();
}
result=numberA/numberB;
return result;
}

}
package Test1;

public class OperationMul extends Operation{
public double getResult()
{
double result=0;
result=numberA*numberB;
return result;
}

}
package Test1;

public class OperationSub extends Operation{
public double getResult()
{
double result=0;
result=numberA-numberB;
return result;
}

}
`


/*工厂*/
package Test1;

public class OperationFactory {
    //static double numberA,numberB;
    public static Operation createOperate(String operate)
    {
        Operation result=null;

        switch(operate)
        {
        case "+":
            result=new OperationAdd();
            break;
        case "-":
            result=new OperationSub();
            break;
        case "*":
            result=new OperationMul();
            break;
        case "/":
            result=new OperationDiv();
            break;

        default:
            break;
        }
        return result;
    }

}
发布了9 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/juan190755422/article/details/44961667