设计模式(C#)——02抽象工厂模式
推荐阅读:
在工厂模式中,一个工厂只能创建一种产品,但我们往往希望,一个工厂能创建一系列产品。很明显工厂模式已经不能满足我们的需求,于是出现了抽象工厂模式。
抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
抽象工厂模式:
1.首先是不同产品类的抽象;
2.其次是不同工厂类的抽象;
3.最后是产品不同系列的抽象;
抽象工厂模式要素:
1、抽象工厂(Creator):是工厂方法模式的核心角色,任何在模式中创建的对象的工厂类必须实现这个接口;
2、具体工厂(Concrete Creator):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象;
3、抽象产品(Product):工厂方法模式所创建的对象的基类,也就是产品对象的共同父类或共同拥有的接口;
4、具体产品(Concrete Product):这个角色实现了抽象产品角色所定义的接口。
下面举个例子来介绍一下上面几个要素之间的关系吧。
例如:命名空间抽象工厂方法模式中包含抽象工厂Factory;具体工厂MNFactory ,YLFactory;抽象产品Milk,Yogurt;具体产品YLMilk,MNMilk,YLYogurt,MNYogurt 。本案例将向大家展示如何使用简单工厂模式来进行不同的算术运算。
代码实现过程:
1.创建抽象产品:
interface Milk//所有牛奶的父类
{
void DisPlay();//显示牛奶品牌
}
interface Yogurt//所有酸奶的父类
{
void Display();//显示酸奶品牌
}
- 所有的具体产品的代码(伊利牛奶,蒙牛牛奶;伊利酸奶,蒙牛酸奶)
class YLMilk:Milk//伊利牛奶
{
public void DisPlay()
{
Console.WriteLine("我是伊利牛奶!");
}
}
class MNMilk:Milk//蒙牛牛奶
{
public void DisPlay()
{
Console.WriteLine("我是蒙牛牛奶!");
}
}
class YLYogurt:Yogurt//伊利酸奶
{
public void Display()
{
Console.WriteLine("我是伊利酸奶!");
}
}
class MNMilk:Yogurt//蒙牛酸奶
{
public void Display()
{
Console.WriteLine("我是蒙牛酸奶!");
}
}
3.抽象工厂
interface Factory//所有工厂的父类
{
Milk CreateMilk();//生产牛奶
Yogurt CreateYogurt();//生产酸奶
}
4.具体工厂(伊利工厂,蒙牛工厂)
class YLFactory:Factory//伊利工厂
{
public Milk CreateMilk()//生产伊利牛奶
{
return new YLMilk();
}
public Yogurt CreateYogurt()//生产伊利酸奶
{
return new YLYogurt();
}
}
class MNFactory:Factory//蒙牛工厂
{
public MNMilk CreateMilk()//生产蒙牛牛奶
{
return new MNMilk();
}
public MNYogurt CreateYogurt()//生产蒙牛酸奶
{
return new MNYogurt();
}
5.使用该工厂
namespace 抽象工厂模式
{
class Program
{
static void Main(string[] args)
{
Factory fact1 = new YLFactory();
Milk milk;
milk = fact1.CreateMilk();
milk.Display();
Yogurt yogurt;
yogurt= fact1.CreateYogurt();
yogurt.Display();
Console.ReadLine();
}
}
}
整合后的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工厂模式
{
class Program
{
static void Main(string[] args)
{
Factory fact1 = new YLFactory();
Milk milk;
milk = fact1.CreateMilk();
milk.Display();
Yogurt yogurt;
yogurt= fact1.CreateYogurt();
yogurt.Display();
Console.ReadLine();
}
}
}
interface Milk//所有牛奶的父类
{
void DisPlay();//显示牛奶品牌
}
interface Yogurt//所有酸奶的父类
{
void Display();//显示酸奶品牌
}
class YLMilk:Milk//伊利牛奶
{
public void DisPlay()
{
Console.WriteLine("我是伊利牛奶!");
}
}
class MNMilk:Milk//蒙牛牛奶
{
public void DisPlay()
{
Console.WriteLine("我是蒙牛牛奶!");
}
}
class YLYogurt:Yogurt//伊利酸奶
{
public void Display()
{
Console.WriteLine("我是伊利酸奶!");
}
}
class MNMilk:Yogurt//蒙牛酸奶
{
public void Display()
{
Console.WriteLine("我是蒙牛酸奶!");
}
}
interface Factory//所有工厂的父类
{
Milk CreateMilk();//生产牛奶
Yogurt CreateYogurt();//生产酸奶
}
class YLFactory:Factory//伊利工厂
{
public Milk CreateMilk()//生产伊利牛奶
{
return new YLMilk();
}
public Yogurt CreateYogurt()//生产伊利酸奶
{
return new YLYogurt();
}
}
class MNFactory:Factory//蒙牛工厂
{
public MNMilk CreateMilk()//生产蒙牛牛奶
{
return new MNMilk();
}
public MNYogurt CreateYogurt()//生产蒙牛酸奶
{
return new MNYogurt();
}
}
总之一点,在抽象工厂模式中,客户端必须针对接口编程,绝对不能针对具体的实现类编程。否则无法保证程序的扩展性和灵活性。不仅仅抽象工厂,在其他的工厂模式中也都是针对接口(抽象)编程。
如果对于抽象工厂模式,你有更好的见解,欢迎评论区留言讨论。
设计模式(C#)——02抽象工厂模式的更多相关文章
- 大话设计模式C++版——抽象工厂模式
前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种——抽象工厂模式(Abstract Facto ...
- JAVA常用设计模式(一、抽象工厂模式)
抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最 ...
- 设计模式学习心得<抽象工厂模式 Abstract Factory>
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...
- C#设计模式系列:抽象工厂模式(AbstractFactory)
出自:http://www.cnblogs.com/libingql/archive/2012/12/09/2809754.html 1. 抽象工厂模式简介 1.1 定义 抽象工厂(Abstract ...
- [Python编程实战] 第一章 python的创建型设计模式1.1抽象工厂模式
注:关乎对象的创建方式的设计模式就是“创建型设计模式”(creational design pattern) 1.1 抽象工厂模式 “抽象工厂模式”(Abstract Factory Pattern) ...
- IOS设计模式浅析之抽象工厂模式(Abstract Factory)
概述 在前面两章中,分别介绍了简单工厂模式和工厂方法模式,我们知道简单工厂模式的优点是去除了客户端与具体产品的依赖,缺点是违反了“开放-关闭原则”:工厂方法模式克服了简单工厂模式的缺点,将产品的创建工 ...
- 大话设计模式Python实现- 抽象工厂模式
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的类 下面是一个抽象工厂的demo: #!/usr/bin/env pyth ...
- 【java设计模式】-03抽象工厂模式
抽象工厂 简述 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类.在抽象工厂模式中,接口是负责创建一个相关对象的工厂 ...
- 一天一个设计模式——Abstract Factory抽象工厂模式
一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...
随机推荐
- python课堂整理12---递归
一.递归特性 1.必须有一个明确的结束条件 2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少 3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据 ...
- python课堂整理9---函数1
函数 一. 函数就是为了完成某一个特定的功能 形式参数不占运行空间,只有传入实参后才占,用完立刻释放空间. 函数一遇到 return 就结束掉了 函数名() :运行函数,有返回值的话用变量承接 def ...
- python下载报错:Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问
更新pip模块的版本:python -m pip install --upgrade pip 但是遇到报错提示: Could not install packages due to an Enviro ...
- 实战SpringCloud响应式微服务系列教程(第一章)
前言 在当今互联网飞速发展的时代,业务需求不断的更新和产品的迭代给系统开发过程和编程模式也带来巨大挑战,Spring Cloud微服务也随之应用而生,从springboot1.x到springboot ...
- 跟着大彬读源码 - Redis 7 - 对象编码之简单动态字符串
Redis 没有直接使用 C 语言传统的字符串表示(以空字符串结尾的字符数组),而是构建了一种名为简单动态字符串(simple dynamic string)的抽象类型,并将 SDS 用作 Redis ...
- <java程序大集合>
1.以下关于开发java程序的描述错误的是(). A.开发java程序的步骤包括:编写源程序,编译,运行 B.编写的java源程序文件使用.java作为扩展名 C:java源文件经编译后,生成后娺为. ...
- EF Core的Code First 基础
一.创建实体类与映射类 通过NuGet引用Microsoft.EntityFrameworkCore 1.创建实体类 Code First可以通过为实体类字段添加相应特性,来创建对应的字段类型等,举例 ...
- hdoj 4715 Difference Between Primes 素数筛选+二分查找
#include <string.h> #include <stdio.h> const int maxn = 1000006; bool vis[1000006]; int ...
- codeforces 576 div2 A-D题解
A题 Description 题目链接: https://codeforces.com/contest/1199/problem/A 题意: 给定长度为n(1≤n≤100000)的一个序列a,以及两个 ...
- swift 分享share页面封装(功能按钮不同)
关于分享功能的页面应该有很多,写这篇swift版本的分享页面,根据不同模块可能分享的功能按钮不一样,引言: 想必大家都使用微博右上角更多按钮,会弹出如下的界面: 在开发中,可能针对同一个app的不同按 ...