`
ljzforever
  • 浏览: 117499 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

petshop4.0学习笔记之设计模式

阅读更多

在petshop4.0中也用到了几个常用的设计模式:简单工厂模式,工厂方法模式,策略模式,并附之返射与配置文件.下面就来用我自己的理解用大白话说出来.

1.简单工厂模式.

 比如A与B一起写代码,A负责前台,B负责后台,B写了两个类:X与Y,A负责调用,那么1.A怎么知道B写了X与Y两个类呢?2.B又增加了Z类怎么办,3.A在代码里写了n个X x = new X(), B把X类改名或重写了怎么办.为了解决这些困难,就提出了简单工厂模式,说白了,有一个基类或接口,然后n个类从它继承,再写一个类作为工厂,里面有个静态方法负责根据转入参数的不同返回从基类或接口继承的具体对象:

    public interface IPerson
    {
        string GetName();
    }

    public class Kernel : IPerson
    {
        public string GetName()
        {
            return "Kernel";
        }
    }

    public class Json : IPerson
    {
        public string GetName()
        {
            return "Json";
        }
    }

    public class PersonFactory
    {
        public static IPerson CreateInstance(string name)
        {
            string path = ConfigurationManager.AppSettings["AssemblyName"];
            string className = "";
            switch (name)
            {
                case "kernel":
                    className = ConfigurationManager.AppSettings["kernelClass"];
                    break;
                default:
                    className = ConfigurationManager.AppSettings["JsonClass"];
                    break;
            }
            return Assembly.Load(path).CreateInstance(className) as IPerson;
        }
    }

    static void Main(string[] args)
        {
            IPerson p1 = PersonFactory.CreateInstance("kernel");
            Console.WriteLine(p1.GetName());
            IPerson p2 = PersonFactory.CreateInstance("Json");
            Console.WriteLine(p2.GetName());
            Console.ReadKey();
        }

如果有变更,现在就只需要更改工厂类就可以了,这样就在一定程度上必免了因为调用对象的变更而导致代码的重写

 

2.工厂方法模式

类不多时一般用简单工厂.如果类非常多,你就会发现这个工厂会奇大无比,这时就需要对这个工厂分解,工厂方法模式就这样提出来了.

工厂方法模式个人认为本质上就是对工厂也工厂了一遍.先用工厂产生特定类的工厂,然后用特定类的工厂生成你所需要的具体对象.

    public interface IPerson
    {
        string GetName();
    }

    public class Kernel : IPerson
    {
        public string GetName()
        {
            return "Kernel";
        }
    }

    public class Json : IPerson
    {
        public string GetName()
        {
            return "Json";
        }
    }

    public interface ICreatePerson
    {
        IPerson CreateInstance();
    }

    public class CreateKernelFactory : ICreatePerson
    {
        public IPerson CreateInstance()
        {
            string path = ConfigurationManager.AppSettings["AssemblyName"];
            string className = ConfigurationManager.AppSettings["kernelClass"];
            return Assembly.Load(path).CreateInstance(className) as IPerson;
        }
    }

    public class CreateJsonFactory : ICreatePerson
    {
        public IPerson CreateInstance()
        {
            string path = ConfigurationManager.AppSettings["AssemblyName"];
            string className = ConfigurationManager.AppSettings["jsonClass"];
            return Assembly.Load(path).CreateInstance(className) as IPerson;
        }
    }
    static void Main(string[] args)
        {
            ICreatePerson c1 = new CreateKernelFactory();
            IPerson p1 = c1.CreateInstance();
            ICreatePerson c2 = new CreateJsonFactory();
            IPerson p2 = c2.CreateInstance();
            Console.WriteLine(p1.GetName());
            Console.WriteLine(p2.GetName());
            Console.ReadKey();
        }

 

3.策略模式

有时候你会发现有些需求其实大体都是一样的,同一类的,就是计算方式不同,这时就可以用策略模式:

public interface IBuy
    {
        string GetCharge();
    }

    public class CashBuy : IBuy
    {
        double charge;
        double cut;
        public CashBuy(double charge, double cut)
        {
            this.charge = charge;
            this.cut = cut;
        }
        public string GetCharge()
        {
            return (charge - cut).ToString();
        }
    }

    public class CreditBuy : IBuy
    {
        double charge;
        double precent;
        public CreditBuy(double charge, double precent)
        {
            this.charge = charge;
            this.precent = precent;
        }
        public string GetCharge()
        {
            return (charge * precent).ToString();
        }
    }

    public class Context
    {
        IBuy buy;
        public Context(IBuy buy)
        {
            this.buy = buy;
        }

        public string GetCharge()
        {
            return buy.GetCharge();
        }
    }

    static void Main(string[] args)
        {
            Context c1 = new Context(new CashBuy(200, 40));
            Context c2 = new Context(new CreditBuy(200, 7));
            Console.WriteLine(c1.GetCharge());
            Console.WriteLine(c2.GetCharge());
            Console.ReadKey();
        }

  你会发现在这里不再用接口new出一个个具体对象,而统一用Context对象,并通过Context得到结果.其实这通过工厂模式也可以得到相同的结果,但它们的测重点有所不同.举个例子:排序算法,我需要的是选择一种算法但这种算法是一种策略,而这些算法实际上是可以相互替代的,即快速排序,基数排序都可实现问题,而我只要求选择一种.而不是工厂里面创建那样,创建产品A(他是根据要求,而不是选择,即只能创建A),他与产品B是不能互相替代的。

然而纯粹的策略模式需要A知道B具体构造了哪些对象,会出现在谈简单工厂时所出的那些问题,所以,我们常常把简单工厂与策略模式一起使用:

4.简单工厂+策略模式

public enum BuyType
    { 
        Cash,
        Credit
    }

    public interface IBuy 
    {
        double GetPrice();
    }

    public class CashBuy : IBuy
    {
        double price;
        double cut;

        public CashBuy(double price, double cut)
        {
            this.price = price;
            this.cut = cut;
        }

        public double GetPrice()
        {
            return price - cut;
        }
    }

    public class CreditBuy : IBuy
    {
        double price;
        double precent;

        public CreditBuy(double price, double precent)
        {
            this.precent = precent;
            this.price = price;
        }

        public double GetPrice()
        {
            return price * (1 - precent);
        }
    }

    public class Content
    {
        IBuy buy = null;

        public Content(BuyType buyType, double price, double cut)
        {
            string path = ConfigurationManager.AppSettings["SimpeFactoryAndStrategyAssemble"];
            string className = "";
            switch (buyType)
            {
                case BuyType.Cash:
                    className = ConfigurationManager.AppSettings["cash"];
                    break;
                default:
                    className = ConfigurationManager.AppSettings["credit"];
                    break;
            }
            //buy = Assembly.Load(path).CreateInstance(className, false, BindingFlags.Default, null, new object[] { price, cut }, null, null) as IBuy;
            Type type = Type.GetType(className, true);
            buy = Activator.CreateInstance(type, price, cut) as IBuy;
        }

        public double GetPrice()
        {
            return buy.GetPrice();
        }
    }

    static void Main(string[] args)
        {
            Content c1 = new Content(BuyType.Cash, 200, 40);
            Content c2 = new Content(BuyType.Credit, 200, 0.7);
            Console.WriteLine(c1.GetPrice().ToString());
            Console.WriteLine(c2.GetPrice().ToString());
            Console.ReadKey();
        }

 

Demo下载:

http://ljzforever.qupan.com/?folder=951925

 

参考的文章:

简单工厂模式 & 策略模式——《大话设计模式》读书笔记1

http://hi.baidu.com/springlie/blog/item/6052ad010f26670e1c958366.html

单一职责原则和 & 开放-封闭原则——《大话设计模式》读书笔记2

http://hi.baidu.com/springlie/blog/item/4d01d5c878efc01f7e3e6f59.html

策略模式和抽象工厂模式差别在那里??我怎么感觉两个一个样!!为了区分而区分???

http://topic.csdn.net/t/20050108/17/3709567.html

深入浅出工厂模式

http://blog.csdn.net/ai92/archive/2004/12/26/229825.aspx

深入浅出策略模式

http://blog.csdn.net/ai92/archive/2004/12/26/229825.aspx

简单工厂模式 和 策略模式 学习笔记

 http://www.cnblogs.com/sun11086/archive/2009/02/06/1385510.html

简单工厂模式与工厂方法模式

http://hi.baidu.com/wookoo/blog/item/b49f1ac7f89d87ded1006097.html

策略模式和工厂模式的不同

http://www.cnblogs.com/ac1985482/archive/2009/03/07/1405608.html

分享到:
评论

相关推荐

    petshop4.0以及详解

    PetShop 4.0是学习.NET开发的绝佳案例,它提供了详细的源代码,可以帮助开发者理解.NET的实战应用。通过分析和重构PetShop 4.0,开发者可以提升自己的.NET编程技能,掌握企业级应用的开发方法。 总结,PetShop 4.0...

    PetShop 4.0 (宠物商店C#版)

    4. **设计模式与架构**:PetShop 4.0采用了多种设计模式,如工厂模式、单例模式、策略模式等,这些模式使得代码结构更加清晰,易于维护和扩展。此外,PetShop 4.0的分层架构(如表示层、业务逻辑层、数据访问层)...

    PetShop4.0学习笔记(1)

    ### PetShop4.0 学习笔记(1) #### 背景介绍 根据描述,作者之前一直在使用.NET 1.1进行开发工作,并计划转向.NET 2.0。但是由于公司使用的服务器版本为Windows 2000,升级.NET框架会遇到一系列问题,包括可能与...

    PetShop4.0的系统架构设计分析

    - **数据库访问模式**:为了更好地组织和管理数据库访问代码,PetShop4.0采用了特定的设计模式,例如工厂模式和代理模式等。 - **缓存机制**:为了提高性能,PetShop4.0还实现了缓存机制,特别是在ASP.NET缓存方面...

    PetShop4.0架构设计

    PetShop 4.0 架构设计是一个经典的案例,展示了如何构建基于.NET Framework 2.0和Asp.Net的Web应用程序。这个系统以其简洁的三层架构而...通过学习PetShop 4.0,开发者能够提升自己在设计和实现企业级应用方面的能力。

    petshop4.0详细教程

    这个详细的教程将带你深入理解PetShop 4.0的设计理念、架构和技术栈,帮助你提升在.NET领域的专业技能。 一、系统架构与设计 PetShop 4.0采用了三层架构,包括表现层(Presentation Layer)、业务逻辑层(Business ...

    PetShop4.0(ppt)

    PetShop 4.0是这个系列的最新版本,它全面采用了微软的.NET Framework 2.0和Asp.Net技术,为我们提供了深入学习.NET设计模式和架构的宝贵资源。 .NET Framework 2.0是微软推出的一种全面的开发框架,它包含了用于...

    Petshop4.0详解.pdf

    ### Petshop4.0详解之系统架构设计 #### 前言 PetShop是一个由微软推出的示例项目,旨在展示.NET框架在企业级应用开发中的能力。随着时间的推移,PetShop经历了多个版本的迭代,从最初的.NET 1.x发展到了基于.NET ...

    petshop4.0源代码 查看

    petshop4.0源代码 查看 petshop4.0源代码 查看 petshop4.0源代码 查看 petshop4.0源代码 查看 petshop4.0源代码 查看 petshop4.0源代码 查看

    petshop 4.0源码及详解

    通过深入研究PetShop 4.0的源码,开发者不仅可以学习到.NET Framework的基础知识,还能掌握到高级特性的实际应用,例如面向服务的架构(SOA)、设计模式、缓存策略等,这些都是构建高效、可扩展的Web应用程序的关键...

    petshop4.0代码|数据库|PDF教程

    通过学习PetShop4.0,开发者不仅可以掌握.NET Framework的基础,还能了解到实际项目中的分层架构设计、数据库设计与管理、以及Web应用的开发流程。这个项目对提升开发者的技术水平和实践经验具有极大的价值。

    PetShop 4.0 官方详解

    从代码优化到体系结构设计,再到新技术的应用,.NET PetShop 4.0 成为了学习和实践.NET 2.0 技术的宝贵资源。 通过细致的代码重构、设计模式的采用以及对最新技术的整合,.NET PetShop 4.0 成功地提高了应用程序的...

    petshop 4.0 5.0 微软原版设计模式

    《PetShop 4.0 和 5.0:微软原版设计模式详解》 PetShop是微软推出的一个经典示例应用程序,它展示了如何利用.NET框架高效地构建分布式电子商务系统。这个项目在4.0和5.0两个版本中,不仅在技术上有所升级,更重要...

    PetShop4.0 源码安装程序

    然而PetShop随着 版本的不断更新,至现在基于.Net 2.0的PetShop4.0为止,整个设计逐渐变得成熟而优雅,却又很多可以借鉴之处。PetShop是一个小型的项目,系统架构与代码都比较简单,却 也凸现了许多颇有价值的设计与...

    petshop4.0

    通过研究PetShop 4.0的源代码,开发者可以深入了解ASP.NET的应用实践,学习如何构建一个完整的电子商务系统,并从中学习到软件设计的最佳实践。无论是对于初学者还是有经验的开发者,PetShop 4.0都是一个宝贵的参考...

    PetShop4.0框架详解

    1. 开发流程:学习PetShop4.0可以帮助开发者了解一个完整的Web应用从需求分析、设计、编码到测试的全过程,理解每个环节的关键点。 2. 技术实践:通过研究PetShop4.0的源代码,可以加深对ASP.NET框架的理解,掌握...

    PetShop4.0源码

    通过分析PetShop 4.0的源码,我们可以深入学习C#编程、ASP.NET架构设计以及数据库操作等多个方面。 首先,让我们关注C#语言。C#是微软开发的一种面向对象的编程语言,它具有丰富的特性和强大的性能。在PetShop 4.0...

    PetShop4.0源码(.net)

    然而PetShop随着版本的不断更新,至现在基于.Net 2.0的PetShop4.0为止,整个设计逐渐变得成熟而优雅,却又很多可以借鉴之处。PetShop是一个小型的项目,系统架构与代码都比较简单,却也凸现了许多颇有价值的设计与...

    PetShop4.0

    【标题】"PetShop4.0" 是一个基于.NET框架的示例应用程序,展示了三层架构在实际项目中的应用。这个项目作为一个学习资源,为开发者提供了一个理解如何在企业级应用中分离业务逻辑、数据访问和用户界面的实例。 ...

Global site tag (gtag.js) - Google Analytics