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;
}
}