设计模式(C#)——02工厂模式
推荐阅读:
在简单工厂模式中讲到简单工厂模式的缺点:难以扩展,一旦添加新运算就必须修改简单工厂方法。
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使其创建过程延迟到子类进行。把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口。
工厂模式要素:
1、抽象工厂(Creator):是工厂方法模式的核心角色,任何在模式中创建的对象的工厂类必须实现这个接口;
2、具体工厂(Concrete Creator):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象;
3、抽象产品(Product):工厂方法模式所创建的对象的基类,也就是产品对象的共同父类或共同拥有的接口;
4、具体产品(Concrete Product):这个角色实现了抽象产品角色所定义的接口。
下面举个例子用类图来介绍一下上面几个要素之间的关系吧。

命名空间工厂方法模式中包含抽象工厂Factory、具体工厂LeiFactory 、抽象产品Volunteer,具体产品Leifeng 。本案例将向大家展示如何使用简单工厂模式来进行不同的算术运算。
代码实现过程:
1.创建抽象类Volunteer
abstract class Volunteer
{
public abstract void sweep();//扫地
public abstract void cook();//煮饭
public abstract void wash();//洗衣服
}
2.创建具体产品Leifeng
class Leifeng : Volunteer
{
public override void sweep()
{
Console.WriteLine("雷锋扫地");
}
public override void cook()
{
Console.WriteLine("雷锋煮饭");
}
public override void wash()
{
Console.WriteLine("雷锋洗衣");
}
}
3.创建抽象工厂Factory
abstract class Factory
{
public abstract Volunteer getvol();
}
4.创建具体工厂LeiFactory
class LeiFactory : Factory
{
public override Volunteer getvol()
{
return (new Leifeng());
}
}
5.使用该工厂,通过传递类型信息来获取实体类的对象。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 工厂方法模式
{
class Program
{
static void Main(string[] args)
{
Factory fact = new LeiFactory();
Volunteer lei = fact.getvol();
lei.cook();
lei.sweep();
lei.wash();
fact = new UniFactory();
lei = fact.getvol();
lei.cook();
lei.sweep();
lei.wash();
}
}
}
从上面代码可以发现:
优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
整合后的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 工厂方法模式
{
class Program
{
//使用工厂方法
static void Main(string[] args)
{
fact = new UniFactory();
lei = fact.getvol();
lei.cook();
lei.sweep();
lei.wash();
}
}
}
//抽象产品基类
abstract class Volunteer
{
public abstract void sweep();
public abstract void cook();
public abstract void wash();
}
//具体产品子类
class Leifeng : Volunteer
{
public override void sweep()
{
Console.WriteLine("雷锋扫地");
}
public override void cook()
{
Console.WriteLine("雷锋煮饭");
}
public override void wash()
{
Console.WriteLine("雷锋洗衣");
}
}
//抽象工厂类
abstract class Factory
{
public abstract Volunteer getvol();
}
//具体工厂
class LeiFactory : Factory
{
public override Volunteer getvol()
{
return (new Leifeng());
}
}
使用工厂方法实现的系统,如果系统需要添加新产品时,我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。
例如,我们我们增加一个人物:“博主”,此时我们只需要定义一个具体工厂——“博主”和具体产品——“博主”子类就可以。而不用像简单工厂模式中那样去修改工厂类中的实现(具体指添加case语句)。具体代码为:
//具体工厂——博主
class BloggerFactory : Factory
{
public override Volunteer getvol()
{
return (new BloggerFactory ());
}
}
//具体产品——博主子类
class Blogger: Volunteer
{
public override void sweep()
{
Console.WriteLine("博主扫地");
}
public override void cook()
{
Console.WriteLine("博主煮饭");
}
public override void wash()
{
Console.WriteLine("博主洗衣");
}
}
好了,工厂模式介绍完了,博主也该去扫地,煮饭,洗衣了。
设计模式(C#)——02工厂模式的更多相关文章
- 【java设计模式】-02工厂模式
工厂模式简述 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客 ...
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...
- 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式
桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...
- C#设计模式(2)-简单工厂模式
引言 上一遍中介绍了设计模式中的单例模式-C#设计模式(1)-单例模式,本篇将介绍简单工厂模式,也是比较容易理解的一种模式: 简单工厂模式简介 什么是简单工厂模式? 定义一个工厂类,它可以根据参数的不 ...
- java设计模式---三种工厂模式
工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...
- Java进阶篇设计模式之二 ----- 工厂模式
前言 在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法.本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式.工厂方法和抽象工厂模式. 简单工厂模式 简单工厂模式是属于创建型模 ...
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
- C#设计模式(2)——简单工厂模式(转)
C#设计模式(2)——简单工厂模式 一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理 ...
- Java设计模式之二 ----- 工厂模式
在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法.本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式.工厂方法和抽象工厂模式. 简单工厂模式 简单工厂模式是属于创建型模式,又 ...
- Java 设计模式之抽象工厂模式(三)
原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...
随机推荐
- STL 优先队列 用法
今天做题用到了优先队列 对它的用法还不是很熟悉 现在整理一下. 需要的库 #include<queue> using namespace std; 不过我都用bits/stdc++.h.. ...
- C++ 八数码问题宽搜
C++ 八数码问题宽搜 题目描述 样例输入 (none) 样例输出 H--F--A AC代码 #include <iostream> #include <stdio.h> #i ...
- 跟着阿里p7一起学java高并发 - 第19天:JUC中的Executor框架详解1,全面掌握java并发核心技术
这是java高并发系列第19篇文章. 本文主要内容 介绍Executor框架相关内容 介绍Executor 介绍ExecutorService 介绍线程池ThreadPoolExecutor及案例 介 ...
- Java 之MVC动态分页完美实现
一个分页小技术有时也是让人挠头,在这里完全前端实现方式与Java的实现方式,我们提供给你完全的编码参考,希望能够帮到你哦(:) 内容导读 1.程序结构 2.JSP页面设计 3.分页主要编码 4.运行效 ...
- 林大妈的JavaScript基础知识(三):JavaScript编程(3)原型
在一般的编程语言中,我们使用继承来复用代码,做成良好的数据结构.而在JavaScript中,我们使用原型来实现以上的需求.由于JavaScript专注于对象而摒弃了类,我们要明白原型和继承的确是有差异 ...
- 接口测试时遇到 java 代码加密请求数据,用 python 的我该怎么办?
前言 自动化测试应用越来越多了,尤其是接口自动化测试. 在接口测试数据传递方面,很多公司都会选择对请求数据进行加密处理. 而目前为主,大部分公司的产品都是java语言实现的.所以加密处理也是java实 ...
- gitee+hexo搭建个人博客
通过gitee和hexo搭建个人博客 首先准备软件: git (提供命令git) git官网 notepad++(方便编辑)notepad++官网 nodejs(hexo依赖)nodejs官网 7z( ...
- Dialog 使用详解
极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...
- Unity经典游戏教程之:合金弹头
版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...
- Git命令备忘录
目录 前言 基本内容 开始之前 基础内容 远程仓库 分支管理 前言 Git在平时的开发中经常使用,整理Git使用全面的梳理. 基本内容 开始之前 请自行准备好Git工具以及配置好Git的基本配置 基础 ...