当前位置: 首页 > 编程日记 > 正文

用C#实现抽象工厂模式

大家都知道,在开发中,如果用好了某种模式,那效率……

嘿嘿      我就不说了

进入正题吧:

以下都为源代码,可直接拷贝,然后自己研究

由于是讲解,所以只涉及基本的架构

项目名为:AbstractFactoryMode

1.建立抽象总工厂

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

namespace AbstractFactoryMode
{
    /// <summary>
    /// 总工厂
    /// </summary>
    public abstract class AbstractFactory
    {
        public abstract AbstractUser CreateUser();
        public abstract AbstractBook CreateBook();
    }
}

2.建立子工厂(子工厂继承总工厂,实现抽象总工厂的抽象方法)

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

namespace AbstractFactoryMode
{
    /// <summary>
    /// 一个具体的工厂
    /// </summary>
    public class ConcreteFactory : AbstractFactory
    {
        /// <summary>
        /// 子工厂,用来创造用户
        /// </summary>
        /// <returns></returns>
        public override AbstractUser CreateUser()
        {
            //具体的产物
            return new User();
        }
        /// <summary>
        /// 子工厂,用来创造书籍
        /// </summary>
        /// <returns></returns>
        public override AbstractBook CreateBook()
        {
            //具体的产物
            return new Book() ;
        }
    }
}

3.建立抽象产物,由具体的实体类继承

//user(用户)抽象产物

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

namespace AbstractFactoryMode
{
    /// <summary>
    /// 抽象产物,写关于创造用户所需要的方法
    /// 此抽象产物可写成接口,实现效果一样
    /// </summary>
    public abstract class AbstractUser
    {
        /// <summary>
        /// 此方法用于创造用户
        /// </summary>
        public abstract void CreateUser();
        //以下还可以写很多方法
        //比如:
        //public abstract IList<user> GetAllUser()--------得到所有用户
        //public abstract user GetUserById()-------根据id查询用户
        //public abstract user ModifyUserByName()----根据姓名修改用户
        //这些方法都可以在user类中实现
        //如果把此方法改为接口,那么user类中就 必须完全实现此抽象产物中的全部方法
    }
}

//book(书籍)抽象产物

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

namespace AbstractFactoryMode
{
    /// <summary>
    /// 抽象产物,写关于创造书籍所需要的方法
    /// 此抽象产物可写成接口,实现效果一样
    /// </summary>
    public abstract class AbstractBook        
    {
        /// <summary>
        /// 此方法用与创造书籍
        /// </summary>
        public abstract void CreateBook();
        //以下还可以写很多方法
        //比如:
        //public abstract IList<book> GetAllBook()--------得到所有书籍
        //public abstract book GetBookById()-------根据id查询书籍
        //public abstract book ModifyBookByName()----根据书名修改书籍
        //这些方法都可以在book类中实现
        //如果把此方法改为接口,那么book类中就 必须完全实现此抽象产物中的全部方法
      
    }
}

4.建立实体类,用于执行具体的操作,并继承对应的抽象产物

//user(用户)类

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

namespace AbstractFactoryMode
{
    /// <summary>
    /// 具体的实现
    /// 继承产物ABstractUser
    /// </summary>
    public class User:AbstractUser
    {
        public override void CreateUser()
        {
            Console.WriteLine("用户创建成功");
        }
/*      public override IList<user> GetAllUser()
        {
            //写实现方法
            //return null;
        }
        public override user GetUserById()
        {
            //写实现方法
            //return null;
        }
        public override user ModifyUserByName()
        {
            //写实现方法
            //return null;
        }*/
    }
}

//book(书籍)类

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

namespace AbstractFactoryMode{
    /// <summary>
    /// 具体的实现
    /// 继承产物ABstractBook
    /// </summary>
    public class Book:AbstractBook
    {
        //重写CreateBook方法
        public override void CreateBook()
        {
            Console.WriteLine("书籍创建成功");
        }
/*      public override IList<Book> GetAllBook()
        {
            //写实现方法
            //return null;
        }
        public override Book GetBookById()
        {
            //写实现方法
            //return null;
        }
        public override Book ModifyBookByName()
        {
            //写实现方法
            //return null;
        }*/
    }
}

5.有此类来实现,相当与项目中的表现层

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

namespace AbstractFactoryMode{
    class Program
    {
        static void Main(string[] args)
        {
            //得到一个子工厂
            AbstractFactory factory = new ConcreteFactory();

//创造用户
            AbstractUser user = factory.CreateUser();
            user.CreateUser();

//创造书籍
            AbstractBook book = factory.CreateBook();
            book.CreateBook();
        }
    }
}

转载于:https://www.cnblogs.com/immensity/archive/2008/07/19/1246781.html

相关文章:

树莓派 raspberry安全关机命令重启命令

树莓派可以通过下面几个命令来实现安全关机&#xff1a;sudo shutdown -h now sudo halt sudo poweroff sudo init 0上面四行代码都可以&#xff0c;执行一行都可以安全关机, ^_^树莓派重启 定时重启方法&#xff1a;sudo reboot shutdown -r now shutdown -r 04:00:00 #定时重…

jps命令(Java Virtual Machine Process Status Tool)(转)

1、介绍 用来查看基于HotSpot的JVM里面中&#xff0c;所有具有访问权限的Java进程的具体状态, 包括进程ID&#xff0c;进程启动的路径及启动参数等等&#xff0c;与unix上的ps类似&#xff0c;只不过jps是用来显示java进程&#xff0c;可以把jps理解为ps的一个子集。 使用jps时…

使用 Smartmontools 检测硬盘坏道

2019独角兽企业重金招聘Python工程师标准>>> 在这篇文章中&#xff0c;我们通过几个必要的步骤&#xff0c;使用特定的磁盘扫描工具让你能够判断 Linux 磁盘或闪存是否存在坏道。 在Linux上使用坏块工具检查坏道 坏块工具可以让用户扫描设备检查坏道或坏块&#xff…

如何使用Github管理自己的代码

本文介绍了使用Github管理代码的基本操作方法。由LSGO软件技术团队的安晟提供。

javassist 初步学习

javassist简介 javassist可以对一个已经编译好了的.class文件的字节码进行改动&#xff0c;比如说我可以为一个类添加一个方法&#xff0c;添加一个属性&#xff0c;也可以修改一个方法等&#xff0c;还可以对一个方法&#xff0c;异常进行拦截等。 我们常用到的动态特性主要…

.NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现

原文:.NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现我个人认为&#xff0c;开发MIS&#xff0c;首先就得解决网格的问题,而开发工具为我们提供了如DataGrid、MSHFlexGrid的控件。其次&#xff0c;是打印的问题&#xff0c;将业务单据与数据报表打印出来。可想…

Silverlight 2 beta 2 中目前不支持共享 WCF 的客户端类型

在调用多个 WCF Service 的时候经常会遇到的一个问题是&#xff0c;某些同样的类型因为在不同的 Service 里用到&#xff0c;就被重复生成了好几个版本的代理类型&#xff0c;分别处在不同的名称空间下。这样&#xff0c;如果一个操作需要同时调用几个 Service&#xff0c;就会…

Matlab与线性代数 -- 逆矩阵

本微信图文详细介绍了Matlab中各种求逆矩阵的方法。

使用intellij idea制作可执行jar文件

可执行jar文件 一个可执行的 jar文件是一个自包含的 Java 应用程序&#xff0c;它存储在特别配置的 JAR 文件中&#xff0c;可以由 JVM 直接执行它而无需事先提取文件或者设置类路径。要运行存储在非可执行的 JAR 中的应用程序&#xff0c;必须将它加入到您的类路径中&#xf…

c# 一些控件常用屬性

Form&#xff1a;ControlBox&#xff1a;移除窗體按鈕(最大化、最小化、關閉組&#xff09;&#xff0c;並從左側移除「系統菜單」Opacity&#xff1a;控制窗體透明度ActiveControl&#xff1a;指出窗體上當前哪一個擦傷擁有焦點BackColor&#xff1a;窗體中任何文本和圖形的默…

centos设置固定IP方法

首先网络模式设为桥接 [rootcentos64 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICEeth0HWADDR00:0C:29:80:9D:41TYPEEthernetUUID29784981-a8cc-4405-8923-264df546350eONBOOTyesNM_CONTROLLEDyesBOOTPROTOstatic #设为静态的IPADDR192.168.0.99 #设置固定ipNETMA…

如何利用离散Hopfield神经网络进行数字识别(1)

如何利用离散Hopfield神经网络进行数字识别&#xff0c;代码部分。

You can't specify target table for update in FROM clause

今天使用mysql,写出一个sql语句&#xff1a; update service_re set is_deleted0 where id(select id from service_re where p_id21000122321 limit 1);执行这样的sql会报一个异常&#xff1a; You cant specify target table for update in FROM clause 查了资料&#xf…

在C# Express 2005中配置 NUnit

在C# Express 2005中配置 NUnit www.cnblogs.com/Pamigo/ 2008-7-28 在网上有很多关于在C#中使用NUnit的相关文章&#xff0c;但是我安装了NUnit后却不知道在C# Express中应该如何配置&#xff0c;相信很多人也遇到了同样的问题。根据自己的摸索总结了一下&#xff0c;希望对大…

如何利用离散Hopfield神经网络进行数字识别(2)

如何利用离散Hopfield神经网络进行数字识别

SQL语句实现取消自增列属性

由于在SQL-SERVER中&#xff0c;自增列属性不能直接修改&#xff0c;但可以通过以下方式变向实现 1、如果仅仅是指定值插入&#xff0c;可用以下语句&#xff0c;临时取消 SET IDENTITY_INSERT TableName ONINSERT INTO tableName(xx,xx) values(xx,xx)SET IDENTITY_INSERT Tab…

Mac OS 提高工作效率的几个快捷键

Mac OS X 命令行中组快捷键 几组导航快捷键 跳至行首 – ControlA 跳至行尾 – ControlE 跳至上一个单词 – Control<- 跳至下一个单词 – Control-> 跳至下一行 – ControlN 跳至上一行 – ControlP 删除上一个单词 – ControlW 删除当前光标位置到行首的文字 – Cont…

什么是离散的Hopfield网络?

什么是离散的Hopfield网络&#xff1f;

《OpenStack实战》——第1章 介绍OpenStack 1.1OpenStack是什么

本节书摘来自异步社区《OpenStack实战》一书中的第1章&#xff0c;第1.1节&#xff0c;作者&#xff1a; 【美】V. K. Cody Bumgardner&#xff08;V. K. 科迪•布姆加德纳&#xff09;著&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 第一部分 入门指南 本…

【转】 一些NET的实用类,不错

http://www.cnblogs.com/9who/archive/2008/08/01/1258248.html转载于:https://www.cnblogs.com/niuniu502/archive/2008/08/01/1258331.html

/dev/null

把/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非常的有用. 禁止标准输出. 1 cat $filename >/dev/null2 # 文件内容丢失&#xff0c;而不会输出到标…

backup restore On Ubuntu

详见&#xff1a;https://help.ubuntu.com/community/BackupYourSystem/TAR 在 使用Ubuntu之前&#xff0c;相信很多人都有过使用Windows系统的经历。如果你备份过Windows系统&#xff0c;那么你一定记忆犹新&#xff1a;首先需要找到一个备份工 具(通常都是私有软件)&#xff…

.net 连接ORACLE 数据库的例子

利用 System.Data.OracleClient.Dll 的组件进行连接&#xff1a; 首先配置WebConfig 文件&#xff1b; <connectionStrings> <add name"oracleconn" connectionString"Data Source"";User IDryq;Password123456" providerName&quo…

什么是SESSION?(一)

本图文通过三个问题的回答&#xff0c;详细介绍了Session的机制。本图文由钟锦提供。

linux下字符串处理工具一:grep

grep常见选项 grep -A &#xff1a;显示匹配行和之后的几行 grep -A 4 "NullPointerException" test.log 找到NullPointerException之后的几行-c &#xff1a;打印匹配到的行数 c:count[adminv069164233.sqa.<pre name"code" class"html"&…

Matlab与随机变量和样本的数字特征

本文主要介绍了常见分布的期望和方差以及样本的数字特征。贡献人为孔令才。

C#的方法的参数修饰符详解

方法参数修饰 (啥也没有) 如果参数的修饰是啥也没有&#xff0c;那么其参数传递的方式是值传递&#xff0c;接受方收到的是原始数据的拷贝 out 说明了参数是引用传递。 params 可变参&#xff0c;注意了这种修饰符针对的参数一定是最后一个参数 ref 引用传递&#xff0c;参数的…

wps 2016 个人版 重新开始编号

wps文档重新开始编号&#xff0c;继续编号&#xff0c;自定义编号 首先选中这一行鼠标右键选中项目符号和编号单击项目符号和编号&#xff0c;你可以重新开始编号为1&#xff0c;继续前一列表&#xff0c;还可自定义&#xff0c;单击确定按钮就可以实现你想要的结果效果图转载于…

Sublime Text保存文件时自动去掉行末空格

1.安装DeleteBlankLines 插件 通过ctrlshiftp组合键打开命令面板 输入install packge后回车 输入DeleteBlankLines后回车进行安装 Sublime Tex去除空白行插件DeleteBlankLines 上文所述安装DeleteBlankLines插件的前提&#xff1a;Package Control已经安装好。 3.Subl…

六步使用ICallbackEventHandler实现无刷新回调

AJAX技术所提倡的无刷新回调&#xff0c;在原来的技术中需要写大量的JavaScript代码或使用一些AJAX框架&#xff0c;使得开发效率和可维护性大大降低。其实ASP.NET2.0中&#xff0c;已经提供了这样的接口&#xff0c;这就是ICallbackEventHandler。关于ICallbackEventHandler网…