设计模式一:简单工厂模式

概念理解:
   1. 解耦:一般通过增加一些抽象层,来实现 功能提供者和功能使用者 两者的解耦隔离。而如果想要扩展功能即增加功能,只需要添加相应的相应的新的功能类,修改中间的抽象类即可,并不用修改使用者部分的代码。并且功能提供者的代码可以复用。而且使得程序更容易理解。

简单工厂模式介绍
一.什么是简单工厂模式?
        简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个子类(这些子类继承  自一个父类或接口)的实例。
二.简单工厂模式包含的角色:
   1.工厂角色(工厂类): 它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
   2.抽象产品角色: 简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
   3.具体产品角色:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。
三.简单工厂模式的类图
        
四.深入分析
    1.核心思想: 有一个专门的类来负责创建实例的过程。
    2. 优点:工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。
   3.缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。 也就违背了“开放封闭原则”,就是违背了“系统对扩展开放,对修改关闭”的原则 (2)
   4. 总结一下:简单工厂模式分离产品的创建者和消费者,有利于软件系统结构的优化;但是由于一切逻辑都集中在一个工厂类中,导致了没有很高的内聚性,同时也违 背了“开放封闭原则”。另外,简单工厂模式的方法一般都是静态的,而静态工厂方法是无法让子类继承的,因此,简单工厂模式无法形成基于基类的继承树结构。
    5.使用场景:
     工厂类负责创建的对象比较少;
     客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
     由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。
五.代码
题目:模拟计算器
 
// 创建抽象产品类(父类)
class Operate{
     int numA;
     int numB;
 
     public getNumA(){
          return numA;
     }
     
     public setNumA(int num){
          numA = num;
     }
 
     public getNumB(){
          return numB;
     }
     public setNumB(int num){
          numB = num;
     }
     
     public int getResult(){}
}
 
// 创建具体产品类
 
class Add extends Operate{
     public int getResult(){
          return numA + numB;
     }
}
 
class Sub extends Operate {
      public int getResult(){
          return numA - numB;
     }
}
 
class Mul extends Opreate{
     public int getResult(){
          return numA * numB;
     }
}
 
class Div extends Opreate{
       public int getResult(){
          if(0 == numB){
               System.out.println("除数不能为0");
               return 0;     
          }
          return numA / numB;
     }
}
 
 
class OperateFactory{
    public static Operate createOperate(String operate){
          OPerate op = null;
          switch(operate){
               case "+":{
                    op = new Add();
               }break;
               case "-":{
                    op = new Sub();
               }break;
               case "*":{
                    op = new Mul();
               }break;
               case "/":{
                    op = new DIV();
               }break;
               deafult:break;
          }
          return op;
     }     
}
 
 
 
posted @ 2015-03-06 23:12  北极星之光  阅读(155)  评论(0编辑  收藏  举报