传统设计模式(四)工厂模式(简单工厂、普通工厂、抽象工厂)

关于工厂模式和单例模式  大部分项目这2种模式都很常见

例如在orm框架中 工厂模式常用来封装数据库的创建 我们分3种case来看 简单工厂模式 普通工厂模式 抽象工厂模式

抽象一点的说 工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。直接看实例

一般惯性思维 我们遇到分支判断时会这样

public class NormalCase
    {
        private DBInstance dbInstance;
        public NormalCase(string type)
        {
              if (type.Equals("SQL"))
            {
                dbInstance=  new SqlInstance();
            }
            else if (type.Equals("Oracle"))
            {
                dbInstance = new OracleInstance();
            }
            else if (type.Equals("Mysql"))
            {
                dbInstance = new MysqlInstance();
            }
        }
        public void ExecuteNonQuery()
        {
            this.dbInstance.ExecuteNonQuery();
        }
        public void ExecuteDataset()
        {
            this.dbInstance.ExecuteDataset();
        }
    }

那么 new有什么不好,在技术上new没什么错,但是好的设计针对扩展开放而对修改关闭。

针对接口编程,可以隔离掉以后系统可能发生的一大堆改变。如果代码是针对接口编写,那么通过多态,它可以与任何新类实现该接口。

下面让我们看看工厂模式如何解决该问题

先来看看简单工厂

public class SimpleFactory
    {
        public DBInstance createinstance(string type)
        {
            DBInstance di = null;
            if (type.Equals("SQL"))
            {
                return new SqlInstance();
            }
            else if (type.Equals("Oracle"))
            {
                return new OracleInstance();
            }
            else if (type.Equals("Mysql"))
            {
                return new MysqlInstance();
            }
            return di;

        }
    }

    public class SimpleCase
    {
        SimpleFactory facotory;
        DBInstance di;
        public SimpleCase(SimpleFactory facotory)
        {
            this.facotory = facotory;
        }
        public DBInstance CreateInstance(string type)
        {
             di = facotory.createinstance(type);
             return di;

        }
        public void ExecuteNonQuery()
        {
            this.di.ExecuteNonQuery();
        }
        public void ExecuteDataset()
        {
            this.di.ExecuteDataset();
        }

    }

准确来说,简单工厂并不是一种设计模式,反而比较像是一种编程习惯。上述case只是把问题从一个对象搬到另一个对象中,问题依然存在。但是SimpleFactory可以有许多客户,把创建实例的代码包装进一个类,当以后实现改变时,只需修改这个类就可以了。物品们也正要把具体实例化的过程从客户的代码中删除。

下面我就来介绍下两个重量级的模式!

工厂方法模式

public abstract class facotoryCase
    {
        DBInstance di;
        public DBInstance CreateInstance(string type)
        {
            di = create(type);
            return di;
        }
       public abstract DBInstance create(string type);

       public void ExecuteNonQuery()
       {
           this.di.ExecuteNonQuery();
       }
       public void ExecuteDataset()
       {
           this.di.ExecuteDataset();
       }
    }

    public class facotoryCaseA : facotoryCase
    {
        public override DBInstance create(string type)
        {
            if (type.Equals("SQL"))
            {
                return new SqlInstance();
            }
            else if (type.Equals("Oracle"))
            {
                return new OracleInstance();
            }
            return null;
        }
    }

    public class facotoryCaseB : facotoryCase
    {
        public override DBInstance create(string type)
        {
            if (type.Equals("Mysql"))
            {
                return new MysqlInstance();
            }
            return null;
        }
    }

工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/project/

设计原则:要依赖抽象不要依赖具体类。

接下来再看下抽象工厂模式

public class Param { }
    public class sqlparm : Param { }
    public class oracleparam : Param { }
    public class connection { }
    public class sqlconnecttion : connection { }
    public class oracleconnecttion : connection { }

    public interface abstractCase
    {
        Param GetParameter();
        connection GetConnection();
    }

    public abstract class DBInstanceforabstract
    {
        public Param p;
        public connection c;
        public abstract void ExecuteNonQuery();
        public abstract void ExecuteDataset();
    }

    public class DBInstanceforabstractA : DBInstanceforabstract
    {
        abstractCase ac;
        public DBInstanceforabstractA(abstractCase ac)
        {
            this.ac = ac;
        }
        public override void ExecuteNonQuery()
        {
            p = ac.GetParameter();
        }
        public override void ExecuteDataset()
        {
            c = ac.GetConnection();

        }

    }

    public class abstractCaseA : abstractCase
    {
        DBInstanceforabstract di;
        public Param GetParameter()
        {
            return new sqlparm();
        }
        public connection GetConnection()
        {
            return new sqlconnecttion();
        }
    }

    public class abstractCaseB : abstractCase
    {
        DBInstanceforabstract di;
        public Param GetParameter()
        {
            return new oracleparam();
        }
        public connection GetConnection()
        {
            return new oracleconnecttion();
        }
    }

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族而不需要明确指定具体类。

Author:cnblogs 熬夜的虫子

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索class
, return
, 工厂模式
, public
, 模式
, type
, executenonquery
, 代码设计模式工厂模式
, 类别设计di
, ExecuteNonQuery()
工厂
简单工厂 抽象工厂、简单工厂与抽象工厂、简单工厂和抽象工厂、抽象工厂模式、抽象工厂模式 java,以便于您获取更多的相关知识。

时间: 2024-11-01 12:55:09

传统设计模式(四)工厂模式(简单工厂、普通工厂、抽象工厂)的相关文章

php工厂模式简单使用说明

工厂模式代码:    代码如下 复制代码 <?php //首先定义什么是人类  interface Human {     //人是愉快的,会笑的     public function laugh();     //人类还会哭,代表痛苦     public function cry();     //人类会说话     public function talk(); } //然后定义具体的人种 class YellowHuman implements Human {//黄色人种,这个翻译的不

重温设计模式(五)——我所理解的“抽象工厂”

在各位读这篇文章之前,我给大家一个提醒,我的文章也许称不上一个设计模式类的文章,只能算是自己在项目中的一个设计总结,在这里,我很欢迎大家和我一起讨论.但是同时我想说,我写博客的目的本身就是希望我的经验可以提醒他人,但是如果造成了一种相反的影响,那就违背我的初衷了,所以希望大家对我的观点思考,思考,再思考!另外,感谢Jake.NET,装配脑袋,横刀天笑等对我的鼓励. 1.代码引子 让我们由一段代码引出我们的这篇文章. 相信每个人,无论是B/S,还是C/S.都无可避免地要去和数据库打交道.那么这样的

.Net Framework源代码中的模式之Abstract Factory(抽象工厂模式)

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 以.NET Framework 2.0 System.Data中类为例. 通过使用DbProviderFactory,只需要修改配置文件,就可以实现不同数据库访问的目的. System.Data.Common.DbProviderFactory public abstract class DbProviderFactory {   public virtual DbConnection CreateConnection() {

php设计模式之简单工厂模式详解_php技巧

本文以实例形式较为详细的介绍了PHP设计模式的简单工厂模式,对于进行PHP程序设计来说有很好的借鉴作用.具体如下: 一.概念 简单工厂模式 [静态工厂方法模式](Static Factory Method) 是类的创建模式 工厂模式的几种形态: 1.简单工厂模式(Simple Factory)又叫做 静态工厂方法模式(Static Factory Method) 2.工厂方法模式(Factory Method)又叫做 多态性工厂模式(Polymorphic Factory) 3.抽象工厂模式(A

设计模式(一)工厂模式Factory(创建型)

设计模式一 工厂模式Factory          在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题

设计模式解 -2(工厂模式)

设计模式一 工厂模式Factory          在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题

设计模式系列之三:抽象工厂模式

前言 在设计模式有三个模式是与工厂模式相关的,分别是:简单工厂模式.工厂方法模式以及抽象工厂模式.在前面的文章中已经谈到前面两种,这里就对抽象工厂模式介绍一下.抽象工厂模式就是提供一个创建一系列相关或者相互依赖的接口(也就是抽象类),而无需指定具体的类.简单来说,就是当我们需要创建一个具体的对象的时候,我们不必指定该具体的对象,只需要使用它的上层接口直接调用就行.好像还是很抽象哦,好吧,为了更清晰领悟这个设计模式,我们还是通过一个案例来说明 问题背景 某公司开发了一个A软件,数据库使用的是SQL

设计模式:工厂方法模式(Factory Method)和抽象工厂模式(Abstact Factory)

 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 分类  工厂模式主要是为创建对象提供过渡接口,以便将创建对象的

设计模式之四(抽象工厂模式第三回合)

原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如IFactory factory=new AccessFactory(),在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置.我们的设计不能去防止需要的变更,那么我们的理想便是让改动变得最小,那么现在如果你要更改数据库访问,