java设计模式——工厂模式

来源:互联网 发布:excel数据透视表计数项 编辑:程序博客网 时间:2024/05/18 19:41

工厂模式——简单工程模式

  1. 简介:
    定义了一个创建对象的类,由这个类来封装实例化对象的行为。
    工厂模式类图

  2. 组成角色
    工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,根据逻辑不同,产生具体的产品。
    抽象产品角色:它一般是具体产品继承的的父类或者实现的接口。由接口或者抽象类来实现。
    具体产品角色:工厂类所创建的对象就是此角色的实例。

  3. 优缺点
    优点
    工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费产品”;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。
    客户端无需知道所创建的具体产品类的类名,只需知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。
    通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
    缺点
    实际开发中,很多产品是一个多层次的树状结构,由于简单工厂模式中只有一个工厂类对应这些产品,所以可能会把我们的客户端累坏。
    由于工厂类集中了所有类的创建逻辑,一旦不能正常工作,整个系统都会受到影响。
    系统扩展困难,一旦添加新的产品,必须要修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
    简单工厂模式由于使用了静态工厂方法,造成了工厂角色无法形成基于继承的等级结构。

  4. 使用场景
    有一组类似的对象需要创建(业务简单)
    一般用于小项目或者具体产品很少扩展的情况
    客户端只知道传入工厂类的参数,对于如何创建对象不关心;客户端既不需要关心具体创建细节,甚至连类名都不需要记住,只需知道类型所对应的参数。

    案例(四则运算表)

    1.如果要求你用java写一九九乘法表,相信大多数人不会有问题,而且很有可能都这样写:

public class MultiTableTest_1 {   public static void main(String[] args){       for(int i=1;i<=9;i++){           for(int j=1;j<=i;j++){               System.out.print(String.format("%d*%d=%d\t",j,i,i*j));           }           System.out.println();       }   }}

2.不错,这样写确实简洁,算法也不错,但是要注意java是一种什么样的语言,它有什么样的特性。对,java是一种面向对象的语言,它的特性是封装、继承、多态。如果不想将结果显示到屏幕上呢,那么就必须修改代码了,显然这样写不易复用、扩展`。那么想想后这样写:

public class MultiTableTest_1 {   public static void MultiTable(){       for(int i=1;i<=9;i++){           for(int j=1;j<=i;j++){               System.out.print(String.format("%d*%d=%d\t",j,i,i*j));           }           System.out.println();       }   }   }

3.确实这样写,体现了java面向对象的思想以及封装,想在哪儿显示,只需调用即可,而且做到了界面逻辑与业务逻辑的分离。这里我们实现的是乘法表,若我想做加法表、除法表、减法表呢?CTRL+C或者CTRL+V显然不是好方法,那么看看用到继承与多态的实现方式:

抽象产品角色:LowTable

   public abstract class LowTable {        public abstract void low();}

具体产品角色1:Multiplica
乘法

 ```    public class Mutiplication extends LowTable {    @Override    public void low() {        for(int i=1;i<=9;i++){               for(int j=1;j<=i;j++){                   System.out.print(String.format("%d*%d=%d\t",j,i,i*j));               }               System.out.println();           }    }}

具体产品角色2:Addition
加法

public class Addition extends LowTable {@Overridepublic void low() {    for(int i=1;i<=9;i++){           for(int j=1;j<=i;j++){               System.out.print(String.format("%d+%2d=%3d\t",j,i,i*j));           }           System.out.println();       } }}

4.下面看看伟大的简单工厂方法
添加一个工厂类,用来实例化对象
工厂类角色:LowTableFactory

 public class LowTableFactory {public  static LowTable TableFactory(String op){    switch (op) {    case "+":        return new Addition();    case "*":        return new Mutiplication();    }    return null; }}

那么客户端使用如下:

public class ClientFactoryUse {    public static void main(String[] args) {       LowTable lowtable= LowTableFactory.TableFactory("*");       lowtable.low();    }}

至此,我们看到了简单工厂设计模式的很多好处,用户无需关心怎么创建,只要提供参数即可;程序的可扩展性也增强。

1 0
原创粉丝点击