zoukankan      html  css  js  c++  java
  • 设计模式学习每日一记(1.简单工厂模式)

    简单工厂模式

    A.定义:

    定义一个用于创建对象的接口.

    B.定义分析:

    "定义一个用于创建对象的接口". 这个模式的应用主要是定义一个接口,每个类都会有接口,对于面向对象语言就是定义一个类,这个类里有个接口.

    "定义一个用于创建对象的接口".定义的这个类中含有的接口,是什么功能呢?用于创建对象.什么样的接口叫做用于创建对象的接口呢?比如:SimpleFactory类的newProduct接口这样实现:

    AbstractProduct* SimpleFactory::newProduct(const char* name) {

      if(0 == strcmp(name, "A")) {

        return new ConcreteProductA();

      }

    }

    newProduct就是创建对象的接口,也就是把new的过程拿到了newProduct接口中.

    C.问题

    (1)为什么要把对象new的过程拿到newProduct这样的简单工厂类的接口里?直接在使用的代码处new一个对象不行吗?

    直接在代码里new一个对象是可以的.问题是

    如果ConcreteProductA这个类的名字修改了呢?所有用到ConcreteProductA类的代码都要修改;

    如果ConcreteProductA的使用并不合理呢?所有用到ConcreteProductA类的代码都要修改;

    如果客户并不知道ConcreteProductA这个类的名字或者我们不想客户知道ConcreteProductA的实现细节呢?

    ...诸如此类的重构或者设计问题.

    所有这些问题的根源在于,ConcreteProductA相关会发生变化,发生变化时,系统的灵活性不够,会造成重构的困难.

    解决办法是:不让客户知道 ConcreteProductA的存在,只需要使用AbstractProduct提供的接口,具体的product类通过工厂接口类创建.这样客户代码和具体product没有任何依赖了,也就不存在重构上的问题.

    (2)可以不定义类,只使用newProduct这样的接口不?

    可以的.但是有些语言是不能有全局方法的,只能用类这样的形式.

    (3)简单工厂有没有什么弊端?

    有的.当新增了产品类型时,需要更改工厂接口newProduct.且当产品类别很多时,简单工厂不是很适用.

    作者:linucos

    出处:http://linucos.cnblogs.com

    声明因文章引起的任何问题,本博客不负任何责任;版权所有,欢迎转载 
  • 相关阅读:
    sizeof()使用错例:sizeof(i++)
    修改linux命令符和解决命令符太长的问题
    【转载】阻止拷贝的三种方式
    git命令几个总结
    scp用法
    RAII
    a linked list
    c++11之函数式编程实例
    [转]基于SAML的单点登录介绍
    [转]OAuth、OAuth2与OpenID区别和联系
  • 原文地址:https://www.cnblogs.com/linucos/p/2222658.html
Copyright © 2011-2022 走看看