惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
Recent Commits to openclaw:main
Recent Commits to openclaw:main
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
罗磊的独立博客
V
Visual Studio Blog
爱范儿
爱范儿
H
Help Net Security
J
Java Code Geeks
I
InfoQ
Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Recorded Future
Recorded Future
Jina AI
Jina AI
Microsoft Security Blog
Microsoft Security Blog
WordPress大学
WordPress大学
GbyAI
GbyAI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Y
Y Combinator Blog
Google DeepMind News
Google DeepMind News
Scott Helme
Scott Helme
S
SegmentFault 最新的问题
S
Securelist
L
LINUX DO - 热门话题
Cyberwarzone
Cyberwarzone
C
Cisco Blogs
Simon Willison's Weblog
Simon Willison's Weblog
G
Google Developers Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
T
The Blog of Author Tim Ferriss
博客园_首页
B
Blog
F
Fortinet All Blogs
AWS News Blog
AWS News Blog
V
Vulnerabilities – Threatpost
S
Secure Thoughts
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Forbes - Security
Forbes - Security
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Schneier on Security
Project Zero
Project Zero
Martin Fowler
Martin Fowler
C
Cybersecurity and Infrastructure Security Agency CISA
N
Netflix TechBlog - Medium
N
News and Events Feed by Topic

博客园 - vito qi

安装VS2015出现的bug,各位安装请注意 苹果编程语言Swift简介 设计模式之三职责链模式 HTML页面做中间页跳转传递参数 第一个 ASP.NET Web API应用程序 ASP.NET MVC中 Jquery AJAX 获取数据利用MVC模型绑定实现输出 ASP.NET应用程序与页面生命周期 自定义服务器控件ImageButton 成功项目经理的三种领导力行为 设计模式之二抽象工厂设计模式 深入理解C#之 参数传递 ref out params ASP.NET 实现文件下载 C#实现根据IP 查找真实地址 IIS 7.0的集成模式和经典模式 ASP.NET 4.0: 请求验证模式变化导致ValidateRequest=false失效 ASP.NET MVC 学习笔记(一) 数据库分离附加工具 c# 新特性 c#总结(一)
设计模式之—简单工厂设计模式
vito qi · 2012-05-27 · via 博客园 - vito qi

今天分享设计模式中最简单的一种模式 简单工厂模式。先从面向对象说起,面向对象有三大特性:继承,封装,多态。

面向对象

所谓封装:在面向对象语言中,我们都是以类来组织代码,类中定义了属性和方法,我们在调用的时候只需要去使用对象的方法名或者属性名就可以了,而不必甚至不需要知道方法的具体实现,类比生活中的例子,榨汁机。我们只知道用它可以榨果汁,放个苹果给我们一杯苹果汁,放个桔子给我们一杯桔子汁就可以了。我们不必要去关心 榨汁机是怎么去工作的。

所谓继承:就是子类继承了父类,父类所有的非私有的方法和属性,子类都可以拿来直接使用。就好比生活中,父亲给儿子留了一笔遗产。你可以直接使用这笔钱而不需要去创造这笔钱然后在去使用。

所谓多态:一个类可以有多个子类,而每个子类只能由一个父类,就好比。一个父亲可以有多个儿子,而每个儿子只可以有一个父亲。对于多态我们有2种理解。第一种是不同的人对同一件事所做的不同反应,例如 工作,对于农民来说就是种地,科学家 搞科研,工人 上班,学生 做作业。第二种是同一个人 在不同情况下,具有不同的身份和角色,例如 同样是你,在公司你可能是员工,在家里 你是你父母的儿子,在路上你是行人。

先来看一个简单的例子:

我们首先定义一个父类Person类:

    /// <summary>
    /// 定义父类Person
    /// </summary>
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }

        /// <summary>
        /// 自我介绍
        /// </summary>
        public void SayHi()
        {
            Console.WriteLine("大家好我是" + Name + ",我今年" + Age + "岁了!");
        }
    }

 定义2个子类,一个Student类,一个Teacher类

 public class Student : Person
    {
    }

 public class Teacher: Person
    {
    }

在控制台中访问:

 static void Main(string[] args)
        {
            Student s = new Student();
            s.Name = "张三";
            s.Age = 20;
            s.SayHi();
        }

输出:

可以看出子类是可以使用父类的非私有的属性和方法。

当然 老师的自我介绍和学生自我介绍肯定不一样。如果我们要实现 老师的自我介绍是 大家好。我是XX老师,我今年工作几年了。 学生的自我介绍是大家好。我是某某学生,我今年多少岁了,应该怎么做呢。

如下图:

编译器会有警告,因为我们在基类中已经使用了SayHi方法来做自我介绍。为了能更好的解决问题。我们就要用到多态了。

我们把基类Person类改写成抽象类,把基类中的SayHi方法改写成抽象方法。

直接上图:

 /// 定义父类Person
    /// </summary>
    public abstract class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }

        /// <summary>
        /// 自我介绍
        /// </summary>
        //public void SayHi()
        //{
           // Console.WriteLine("大家好我是" + Name + ",我今年" + Age + "岁了!");
        //}
        /// <summary>
        /// 抽象方法,自我介绍
        /// 抽象方法没有具体实现,只能通过子类覆写来实现。
        /// </summary>
        public abstract void SayHi();
    }

子类

 public class Teacher : Person
    {
        public int YearOfWork { get; set; }

        public override void SayHi()
        {
            Console.WriteLine("大家好我是" + Name + "老师,我工作" + YearOfWork + "年了!");
        }
    }

 public class Student : Person
    {
        /// <summary>
        /// 重写基类自我介绍方法
        /// </summary>
        public override void SayHi()
        {
            Console.WriteLine("大家好我是" + Name + ",我今年" + Age + "岁了!");
        }
    }

在Main方法中 定义如下

static void Main(string[] args)
        {
            Teacher t = new Teacher();
            t.Name = "AAA";
            t.YearOfWork = 5;
            t.SayHi();

            Person p = new Teacher() { Age = 18, Name = "李四", YearOfWork = 5 };
            p.SayHi();
        }

输出结果

如上图 我们可以看到 p 和t 都是调用的teacher类中的sayhi方法。 这就是多态。子类通过覆写 父类中的抽象方法或者虚方法来实现。

这个也叫里氏替换原则 就是凡是父类出现的地方子类都可以出现。 试想一下 如果 Person类不定义为抽象类。以上2个输出结果会有什么不同。

简单工厂正是 基于以上原则来实现的。

以上是对面向对象的一个简单回顾。下面我们来讲 简单工厂设计模式。设计模式不是一种新的技术,只是在编写代码中一些好的方式的积累和经验的积累。

 从上图 我们可以看出:

从结构可以看出,工厂依赖于所有的子类产品,客户只需知道父类产品和工厂即可。工厂是整个模式的核心,以不变应万变。

在现实生活中 我们知道。工厂是用来生产产品的。在面向对象的技术里面工厂也是用来生产产品的。在这里我们的工厂是用来给类生产对象的。

在前面我们简单介绍过封装 继承 多态。那么在使用简单工厂模式的时候我们首先要定义好角色。父类 ,子类 和工厂类。 子类继承父类。 父类定义子类要实现的方法。工厂 创建类的对象。客户调用的时候只需要 知道工厂类和父类就可以了。上图红线标注。

我们以生活中的例子来说明。

首先我们创建一个父类 。我们知道车有很多。什么宝马 奔驰。等等。我们先定义一个父类 。小汽车类

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

namespace Demo
{
    /// <summary>
    /// 父类
    /// </summary>
    public abstract class Car
    {
        public abstract void Run();
    }
}

在来定义2个子类 ,子类继承父类

一个是宝马汽车类:

/// <summary>
    /// 子类1
    /// </summary>
   public class BMWCar:Car
    {
        public override void Run()
        {
            Console.WriteLine("宝马轿车在行驶!");
        }
    }


    /// <summary>
    /// 子类2
    /// </summary>
    public class BenzCar:Car
    {
        public override void Run()
        {
            Console.WriteLine("奔驰轿车在行驶!");
        }
    }

在来定义一个工厂类

 /// <summary>
    /// 工厂
    /// </summary>
   public class Factory
    {
       public static Car CreateCar(string carType)
       {
           Car car = null;
           switch (carType)
           {
               case "BMW":
                   car = new BMWCar();
                   break;
               case "Benz":
                   car = new BenzCar();
                   break;
           }
           return car;
       }
    }

在工厂类中。我们定义了一来Create方法。用来创建对象。通过父类对象来返回我们创建的对象。

在Main方法 中调用 就是上图中的客户端。我们只需要关注父类和工厂 。

 Car car = Factory.CreateCar("Benz");
 car.Run();

运行结果 就是 :奔驰汽车在行驶。

直接上代码:

点我下载