zoukankan      html  css  js  c++  java
  • Factory Method模式与Abstract Factory模式区别

          在开发网站的时候,我们经常要用到Factory Method模式与Abstract Factory模式,但它们有很多相似之处,大家容易搞混,那它们到底有那些区别呢?

    Factory Method模式:Factory Method模式使一个类的实例化延迟到子类,具体来讲,就是Factory Method模式将创建对象实例的责任转移到工厂类,也就是说在工厂类里面,定义对象的实例化。

    Abstract Factory模式Abstract Factory模式是一系列对象的创建,所以在抽象工厂类里面要创建一系列的对象的实例化,而不是单个对象的实例化。 切记这一系列对象存在一定的联系。

    演示代码一

    大家知道数据库有 SQL数据库与甲骨文数据库,现实当中我们有时候需要变换不同的数据库访问 以下采用Factory Method模式做这个变换效果

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace FactoryMethod
    {
        
    class Program
        
    {
            
    static void Main(string[] args)
            
    {

                Sql test 
    = (Sql)ManagerDatabase.Factory.Create();
                test.WriteDatabase(
    "访问的是SQL数据库");

                
    //Oracle test = (Oracle)ManagerDatabase.Factory.Create();
                
    //test.WriteDatabase("访问的是Oracle数据库");
            }



            
    public abstract class ManagerDatabase //采用什么数据库来访问
            {
                
    public static DatabaseFactory Factory = new SqlFactory();//采用Sql数据库访问
                
    //public static DatabaseFactory Factory = new OracleFactory();//采用甲骨文数据库访问
            }


            
    public abstract class Database //数据库
            {
                
    public abstract void WriteDatabase(string name);
            }


            
    public class Sql : Database //SQL数据库
            {
                
    public override void WriteDatabase(string name)
                
    {
                    Console.WriteLine(name);
                }

            }


            
    public class Oracle : Database //甲骨文数据库
            {
                
    public override void WriteDatabase(string name)
                
    {
                    Console.WriteLine(name);
                }

            }


            
    public abstract class DatabaseFactory //数据库工厂
            {
                
    public abstract Database Create();
            }


            
    public class SqlFactory : DatabaseFactory //生产SQL数据库
            {
                
    public override Database Create()
                
    {
                    
    return new Sql();
                }

            }


            
    public class OracleFactory : DatabaseFactory //生产甲骨文数据库
            {
                
    public override Database Create()
                
    {
                    
    return new Oracle();
                }

            }


        }

    }



    结果输出:访问的是SQL数据库


    演示代码二

          大家都知道衣服 有纽扣 也有衣领, 纽扣 衣领这些小东西一般需要交给加工厂单独来制作,在这里我们假设在中国加工厂制作称为中国的衣服(中国制造),在美国加工厂制作称为美国的衣服(美国制造)。以下采用abstractFactory模式来演示。

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace abstractFactory
    {
        
    class Program
        
    {

            
    public interface IButton //纽扣
            {
                
    void Button();
            }


            
    public interface ICollar//衣领
            {
                
    void Collar();
            }


            
    public class ChinaButton : IButton //中国纽扣
            {

                
    public void Button()
                
    {
                    Console.WriteLine(
    "中国的纽扣");
                }


            }


            
    public class ChinaCollar : ICollar //中国衣领
            {

                
    public void Collar()
                
    {
                    Console.WriteLine(
    "中国的衣领");
                }


            }

            
    public class USAButton : IButton //美国纽扣
            {

                
    public void Button()
                
    {
                    Console.WriteLine(
    "美国的纽扣");
                }


            }


            
    public class USACollar : ICollar  //美国衣领
            {

                
    public void Collar()
                
    {
                    Console.WriteLine(
    "美国的衣领");
                }


            }



            
    public interface IClothesFactory //衣服加工厂
            {
                IButton DoButton();
                ICollar DoCollar();
            }



            
    public class ChinaFactory : IClothesFactory //中国的衣服加工厂 //切记是多个对象的实例化
            {
                
    public IButton DoButton()
                
    {
                    
    return new ChinaButton();
                }

                
    public ICollar DoCollar()
                
    {
                    
    return new ChinaCollar();
                }

            }



            
    public class USAFactory : IClothesFactory//美国的衣服加工厂  切记是多个对象的实例化
            {
                
    public IButton DoButton()
                
    {
                    
    return new USAButton();
                }

                
    public ICollar DoCollar()
                
    {
                    
    return new USACollar();
                }

            }


            
    public abstract class Manufacturing
            
    {
                
    public static IClothesFactory Factory = new ChinaFactory(); //中国制造
                
    //public static IClothesFactory Factory = new USAFactory();//美国制造

            }


            
    static void Main(string[] args)
            
    {
                IButton cf 
    = (IButton)Manufacturing.Factory.DoButton();
                ICollar af 
    = (ICollar)Manufacturing.Factory.DoCollar();
                cf.Button();
    //做纽扣
                af.Collar();//做衣领
                Console.Read();


            }

        }

    }



    结果输出:中国的纽扣
                  中国的衣领





  • 相关阅读:
    C#事件(event)解析
    dll加入到GAC后,如何方便的调试
    『C程序设计』读书笔记系列文章之第四章 逻辑运算和判断选取控制
    C#委托之个人理解
    虚方法(virtual)和抽象方法(abstract)的区别
    『C程序设计』读书笔记系列文章之第二章 数据类型、运算符与表达式
    SOA概览(转)
    今天学的几个有用的句型
    【老孙随笔】PPT高手的启示
    【项目经理之修炼(11)】《初级篇》什么样的项目经理才可能成功??
  • 原文地址:https://www.cnblogs.com/xiaobaigang/p/912641.html
Copyright © 2011-2022 走看看