`

设计模式学习笔记三:简单工厂(Simple Factory)

    博客分类:
  • .Net
阅读更多

开始学习创建型模式,这些模式的使用是面向接口编程的必然结果,面向接口编程要求针对接口,而不是具体的实现,这样程序可以不用关心具体使用实现也能做到实现的互换。尽管编程是面向接口,但执行是操作需要实例化后的对象,而实例化必须要针对具体的类。如果直接实例化,则破坏了面向接口编程的原则。解决的方法就是通过一个专门实例化的类来获得具体的对象,通常我们将这个类成为“工厂”,将与实例化相关的模式成为“创建型模式”。
    1.概述
     简单工厂(Simple Factory)的作用是实例化对象,而不需要客户了解这个对象属于那个具体的子类。在GOF的设计模式中并没有简单工厂,而是将其作为工厂方法的一个特例加以解释,简单工厂就是参数化的工厂方法。该模式是通过switch分支(也有用if判断的),来决定最终生成哪一个对象的,而这个switch分支语句,嵌在一个静态方法中,这个改装就是简单工厂。
    2.实例    
    1).大话设计模式中的计算器用简单工厂实现。
    结构图:


    代码:
    Operation基类:

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> public class Operation
    
{
        
private double _numbleA=0;
        
private double _numbleB=0;

        
public double NumbleA
        
{
            
get return _numbleA; }
            
set { _numbleA = value; }
        }


        
public double NumbleB
        
{
            
get return _numbleB; }
            
set { _numbleB = value; }
        }


        
public virtual double GetResult()
        
{
            
double Result = 0;
            
return Result;
        }

    }

加法类:

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    public class OperationAdd:Operation 
    
{
        
public override double GetResult()
        
{
            
double Result = 0;
            Result 
= NumbleA + NumbleB;
            
return Result;
        }

    }

减法类:  

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    public class OprationSub:Operation
    
{
        
public override double GetResult()
        
{
            
double Result = 0;
            Result 
= NumbleA + NumbleB;
            
return Result;
        }

    }

乘法类:

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    public class OperationMul:Operation 
    
{
        
public override double GetResult()
        
{
            
double Result = 0;
            Result 
= NumbleA + NumbleB;
            
return Result;
        }

    }

运算工厂类:

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    public class OperationFactory
    
{
        
public static Operation CreateOperate(string Operate)
        
{
            Operation oper 
= null;
            
switch (Operate)
            
{
                
case "+":
                    oper
=new OperationAdd();
                    
break;
                
case "-":
                    oper 
= new OprationSub();
                    
break;
                
case "*":
                    oper 
= new OperationMul();
                    
break;
            }

            
return oper;
        }

    }

    2).典型应用——获取数据连接对象
    结构图:
    
    具体代码实现:
    数据库操作基类:

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    public abstract class AbstractDB
    
{
        
protected string connString;
        
public string ConnString
        
{
            
get return connString; }
            
set { connString = value; }
        }


        
public void New(string cs)
        
{
            connString 
= cs;
        }


        
public  abstract void Open();
        
public abstract void Close();
        
public abstract DataTable ExecSql(string strSql);
        
public abstract void ExecSqlNoquery(string strSql);
        
public abstract string TrateDateFiled(string strDateValue);
    }

 

    Sql2005实现类:
    其他实现类相同,不再重复。哈哈,比较偷懒。

 

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->public class Sql2005DB : AbstractDB
    
{
        
private SqlConnection Mconn;

        
public  Sql2005DB(string cs)
        
{
            
base.New(cs);
            Mconn 
= new SqlConnection();
        }


        
public override void Open()
        
{
            
if (Mconn == null)
            
{
                Mconn
=new SqlConnection();
            }

        }


        
public override void Close()
        
{
            
if (Mconn != null && Mconn.State != ConnectionState.Closed)
            
{
                Mconn.Close();
            }

        }


        
public override DataTable ExecSql(string strSql)
        
{
            DataTable dt
=new DataTable();
            SqlCommand sqlCom 
= new SqlCommand(strSql);
            SqlDataAdapter da 
= new SqlDataAdapter(sqlCom);
            sqlCom.Connection 
= Mconn;
            da.Fill(dt);
            
return dt;
        }


        
public override void ExecSqlNoquery(string strSql)
        
{
            SqlCommand sqlCom 
= new SqlCommand(strSql);
            sqlCom.Connection 
= Mconn;
            sqlCom.ExecuteNonQuery();
        }


        
public override string TrateDateFiled(string strDateValue)
        
{
            
return "_ToDate(" + strDateValue + ")";
        }

    }


    数据库工厂:

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->public class DBFactory
    
{
        
public static AbstractDB CreateDB(string strType,string strConnString)
        
{
            AbstractDB mysql
=null;
            
switch (strType)
            
{
                
case "OleDB":
                     mysql 
= new OleDB(strConnString);
                     
break;
                
case "Sql@005":
                     mysql 
= new Sql2005DB(strConnString);
                     
break;
                
case "":
                     mysql 
= new OracleDB(strConnString);
                     
break;
            }

            
return mysql;
        }

    }


    3.总结
    简单工厂的使用场合:简单工厂实例化的类具有相同的接口,种类有限并且基本不需要扩展时,可以使用简单工厂,例如,我们实现不同数据库连接时,常用数据库类可以预知,则可以使用简单工厂。
    简单工厂的优点是可以使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性;缺点是所实例化的类在编译期间已经被确定,如果增加新类型,则需要修改工厂。一旦增加新产品类,同时要实现抽象类中的所有方法;还有,一旦要修改抽象类中的方法,所有子类都要变动——扩展性差,不符合开闭原则。另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。
    简单工厂要知道所有要生成的类型,当子类过多或者子类层次过多时就不适合使用简单工厂。

分享到:
评论

相关推荐

    23种设计模式学习笔记及源码

    这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,以及它们在Java编程中的应用。 1. **单例模式**:确保一个类只有一个实例,并...

    设计模式学习笔记

    ### 设计模式学习笔记 #### 一、简单工厂模式 (Simple Factory) **类图与描述:** 简单工厂模式的核心在于存在一个工厂类,这个工厂类能够根据不同的输入参数返回不同的对象实例。简单工厂模式并不涉及继承关系,...

    Java中的design-patterns::open_book:使用通俗易懂的案例,类图,以及配套学习笔记来详解Java的二十种设计模式!

    :check_mark:简单工厂模式( Simple Factor Pattern ) :memo: , :check_mark:工厂方法模式( Factory Method Pattern ) :memo: , :check_mark:抽象工厂模式( Abstract Factroy Pattern ) :memo: , :check_...

    java设计模式(收集整理,学习笔记)

    在Java中,设计模式主要分为三大类:创建型、结构型和行为型。下面将详细讨论在给定文件中提及的两种模式——单例模式和工厂模式。 ### 单例模式 单例模式确保一个类只有一个实例,并提供全局访问点。这种模式在...

    23种设计模式分析学习笔记(Java版)

    创建型设计模式主要用于对象的创建,包括简单工厂模式、抽象工厂模式和工厂方法模式。简单工厂模式通过一个静态方法创建对象,使得客户端代码与具体类的创建分离,增强了系统的可扩展性。例如,我们可以通过传入参数...

    设计模式笔记

    - **Simple Factory(简单工厂模式)**:通过提供一个创建产品实例的方法,使得客户无需指定产品的具体类,从而降低了客户端与产品类间的耦合。 - **Abstract Factory(抽象工厂模式)**:为创建一系列相关或相互...

    设计模式笔记总结 含C#示例代码 复习好帮手

    本篇文章是对一份设计模式学习资料的深入解读,这份资料包含了19种经典的设计模式,并提供了C#示例代码,适用于学习和复习。下面将逐一介绍这些设计模式及其核心概念。 #### 1. 简单工厂模式 (Simple Factory ...

    java版中国象棋源码-hello-design-pattern:设计模式学习笔记

    设计模式学习笔记,此项目参考《大话设计模式》,只能作为入门级设计模式学习 设计原则 职责单一原则 开放-封闭原则 依赖倒转原则 高层模块不依赖底层模块,两个模块都应该依赖抽象。抽象不依赖细节,细节依赖抽象。...

    良葛格DesignPattern学习笔记

    ### 设计模式学习笔记知识点概览 #### 一、引言 设计模式是软件工程领域中一种非常重要的概念,它代表了一种最佳实践的方式,帮助开发者解决特定问题时能够更加高效、灵活。良葛格的《Design Pattern学习笔记》不仅...

    spring学习笔记1

    ### Spring学习笔记1 #### 一、Spring框架简介与IOC概念 **Spring**是一个开源的Java平台框架,它提供了一种全面的编程模型,并通过一系列的功能模块支持企业级应用程序开发。Spring的核心特性包括依赖注入...

    MLDN_J2EE框架_笔记(已解密)

    10. **设计模式**:在J2EE开发中常见的设计模式,如MVC(Model-View-Controller)、Singleton、Factory等。 11. **性能优化和测试**:涉及J2EE应用的性能监控、调优策略,以及单元测试和集成测试的工具和方法。 12...

    RabbitMQ自学笔记

    综上所述,通过本篇笔记的学习,读者可以全面掌握RabbitMQ的基本使用方法以及一些高级特性,这对于实际项目中的消息处理需求提供了强有力的支持。无论是简单的消息传输还是复杂的分布式系统架构设计,RabbitMQ都能...

Global site tag (gtag.js) - Google Analytics