【大话设计模式】——工厂三姐妹

最近在看设计模式,故事好玩是好玩,可是代码也很多啊,有时候看图不太理解,为了让自己有兴趣并且坚持下去,在第一遍宏观的看了一遍之后,把23种设计模式进行了一下分类,然后再找类似的模式一起学习,通过对比学习再理解,确实是容易了一些。先学的创建型模式里的工厂三姐妹,一块学习这三个模式,比较一下它们的优缺点,知道什么时候要用什么模式。

一、概念介绍

1、简单工厂:Simple Factory,是由一个工厂对象决定创建出哪一种产品类的实例,是工厂模式家族中最简单实用的模式。

个人理解:将界面与业务逻辑分离,分离出一个类专门来创建实例的过程。

2、工厂方法:Factory Method,定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

个人理解:为了遵循扩展开放,修改关闭原则,将简单工厂类转换为工厂方法接口,将其Switch分支分离成子类去继承工厂方法接口类,顺利的将创建对象的过程延迟到子类。

3、抽象工厂:Abstract Factory,提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

个人理解:工厂方法模式的转变,增加工厂方法接口的方法就重构出了抽象工厂。

二、实例讲解(以访问DB为例)

1、Simple Factory

创建一个简单工厂,用来创建实例化User类和Department类。在客户端代码中直接得到数据库访问实例即可,不依赖与Sqlserver与Access数据库。

客户端代码:

static void Main(string [] args)
        {
            User user = new User();
            Department department = new department();

            IUser su=DataAccess.CreateUser ();
            su.Insert(user);
            su.GetUser(1);

            IDepartment ide = DataAccess.CreateDepartment();
            ide.Insert(department);
            ide.GetDepartment(343);

            Console.Read();
        }

2、Factory Method

需要用到3个工厂,达到了业务逻辑与数据访问分离,客户端代码在运行时不需要知道在访问哪个数据库。

客户端代码:

static void Main(string [] args)
        {
            User user = new User();

            Ifactory factory=new AccessFactory();

            IUser su=factory.CreateUser ();
            su.Insert(user);
            su.GetUser(1);

            Console.Read();
        }

3、Abstract Factory

增加了访问的数据库中的表,只需增加相应的类以及接口,在Ifactory接口中增加相对应的创建对象的方法即可。

客户端代码(与工厂方法类似):

static void Main(string [] args)
        {
            User user = new User();
            Department department = new Department();

            Ifactory factory=new AccessFactory();//确定实例化哪一个数据库访问对象给factory

            IUser su=factory.CreateUser ();//与具体的数据库解除了依赖
            su.Insert(user);
            su.GetUser(1);

            IDepartment ide = factory.CreateDepartment();
            ide.Insert(department);
            ide.GetDepartment(343);

            Console.Read();
        }

三、比较

1、简单工厂VS工厂方法

相同点:都达到了业务逻辑与访问数据的分离。

不同点:

(1)简单工厂:对象的实例化在工厂中,需要用Switch进行条件选择,违背了修改关闭的原则,但是对于客户端来说,去除了对具体产品的依赖。

(2)工厂方法:将实例化的过程延迟到子类,工厂方法将内部逻辑判断转移到了客户端中,只需要修改客户端即可。遵循了开放——封闭原则。

2、抽象工厂优点VS缺点

优点:改变一个产品系列时,只需改变具体的工厂即可,没有其他的变动,与具体产品无关。遵循了开放——封闭原与依赖倒转原则。

缺点:如果增加一个功能,就要增加相应的类,接口,还要改变Ifactory工厂,SqlserverFactory以及AccessFactory三个工厂类。

四、感受

刚开始的时候觉得有些地方还是有点不太理解,等到总结要画图的时候突然就明白了一些,看来还是画图的作用大啊,往下学设计模式的时候要边画图边敲代码,这样理解会好一些的。

不足之处:对这三个模式的学习时间长了一些,丢了宏观。接下来要好好调整一下战略。

时间: 2024-12-29 23:25:23

【大话设计模式】——工厂三姐妹的相关文章

设计模式------工厂三姐妹

设计模式学完了,我是按照大话书上的顺序一个一个学习的,其中有三个模式名称中含有"工厂"这两个字眼,而且都属于创建型,它们就是"工厂三姐妹",下面我们通过计算器的示例来好好认识一下这姐妹三儿. 简单工厂模式: 简单工厂类中的代码: 从中我们可以看到,当用户请求进行加法运算时,只需operationFactory.createOperate("+"),工厂就会自动给出一个加法类的实例,用户根本不用和具体的运算类打交道,对象的创建过程被封装起来了.但是

设计模式工厂三姐妹

最近对于设计模式中的工厂三姐妹--大姐(抽象工厂).二姐(工厂模式).三姐(简单工厂),进一步学习了,以下是我的一些认识. 一.简单工厂 运用了一个单独的类将创建实例的过程独立出来,这就是简单工厂类,如:简单运算工厂类,至于在运用的过程中,如果增加运算运算,需要修改运算工厂类,这就违背了 开放-封闭原则(尽可能使代码做到扩展的开放,更改的封闭,也就是对于程序的改动通过增加代码进行,而不是更改现有的代码). 二.工厂模式 相对于以上的简单工厂增加了工厂子类,使一个类的实例话延迟到子类,这样在增加运

创建型模式-工厂三姐妹

简单工厂模式: 就简单工厂而言,算是三姐妹之中最小的一个,也是最简单的一个了! 简单工厂模式是类的创建模式,又叫做静态工厂方法模式.虽然为很多模式提供了基础与方便,但是他却不属于23种GOF设计模式之一,至于为什么?或许就是因为他不符合开放-封闭老爷子的脾气吧! 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 工厂方法模式: 最大的特点就是针对每一个对象建造一个工厂.同时这也是这个模式的缺点.由于每加一个产品,就要增加一个产品工厂的类,这样无疑就增加了额外的开发量. 那么优点是什么呢

设计模式------厂三姐妹

设计模式完成学业,我是一个研究躺在订单,有三种模式其名称中包含"工厂"这个词眼,.它们就是"工厂三姐妹",以下我们通过计算器的演示样例来好好认识一下这姐妹三儿. 简单工厂模式: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ1lMX2hhcHB5Z2lybA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast"

6.大话设计模式-工厂模式

工厂模式和简单工厂有什么区别.废话不多说,对比第一篇例子应该很清楚能看出来. 优点: 工厂模式弥补了简单工厂模式中违背开放-封闭原则,又保持了封装对象创建过程的优点. using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace DesignModel{    public interface Factory   

大话设计模式第三章之单一职责原则

单一职责原则指的是就一个类而言,应该仅有一个引起它变化的原因. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能削弱或者抑制这个类完成其它职责的能力(就像一个程序员  叫他去做医学研究,生物研究,可能会抑制他学设计模式的能力).这种耦合会导致脆弱的设计,当变化发生时,设计会遭到异常不到的破坏(你医学研究久了,设计模式少接触,也就生疏了). 在写一个类的时候,要在类的职责分离上多思考(类的职责搞不清楚,就好像你生病了去找修车的,买菜去学校买),这样代码才是真正的可维护,易扩

大话设计模式---工厂模式

简单工厂 VS 工厂方法 简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖.但添加新功能时需要修改原有的类,违背开发-封闭原则. 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 工厂方法模式实现时,客户端需要决定实例化哪个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行.你想要加功能,本来是改

大话设计模式----工厂方法模式

一.工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 二.代码示例 public class LeiFeng { public void seep() { System.out.println("扫地"); } public void wash() { System.out.println("洗衣"); } public void buyRice() { System.out.println("买大

大话设计模式第三、四、五章--一些设计原则

单一职责: 就一个类而言,应该仅有一个引起它变化的原因. 如果一个类承担的责任过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力.这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏. 软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离.如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多疑一个的职责. 开放-封闭原则: 软件实体(类.模块.函数等)应该可以扩展,但是不可修改. 在我们最初编写代码时,假设变化不会发生.当变化