《大话设计模式》学习笔记系列--1. 简单工厂模式

简单工厂模式实现了一种"工厂"概念的面向对象设计模式,它可以在不指定对象具体类型的情况下创建对象。其实质是定义一个创建对象的接口,但让实现这个接口的类来决定实例化具体类。工厂方法让类的实例化推迟到子类中进行。

以书本上的计算器程序为例,其UML描述如下:

图中,AddOperator, SubtactOpertor继承算式基类Operator,而CreateOperator则是负责创建一个操作类,而不指明具体的子类类型。

下面,我们来看代码:

首先操作积累:

/// <summary>

/// 操作基类

/// </summary>

public class Operator

{

public decimal numLeft = 0;

public decimal numRight = 0;

public virtual decimal GetResult() { return 0; }

}

基类定义了两个操作数numLeft, numRight,然后定义一个虚方法GetResult(),以供在子类中重写来实现操作的多样性。

接着,我们实现两个子类:AddOperator, SubtractOperator:

加法类:AddOperator:

public class AddOperator : Operator

{

public override decimal GetResult()

{

return this.numLeft + this.numRight;

}

}

减法类:SubtractOperator:

public class SubtractOperator : Operator

{

public override decimal GetResult()

{

return this.numLeft - this.numRight;

}

}

最后,提供一个创建操作类CreateOperator, 里面有一个Create()用来返回Operator对象:

public static Operator Create(string strOperator)

{

Operator result = null;

switch (strOperator)

{

case "+":

result = new AddOperator();

break;

case "-":

result = new SubtractOperator();

break;

default:

result = new Operator();

break;

}

return result;

}

这样,一个简单的工厂方法模式就实现了,我们来写一下简单的测试代码:

static void Main(string[] args)

{

Operator opt = CreateOperator.Create("+");

opt.numLeft = 2;

opt.numRight = 3;

Console.WriteLine(opt.GetResult());

Operator opt1 = CreateOperator.Create("-");

opt1.numLeft = 10;

opt1.numRight = 2;

Console.WriteLine(opt1.GetResult());

Console.ReadKey();

}

运行可以看懂啊,前一个结果是2+3=5, 后一个是10-2=8.

那么:这是一个很简单的计算器例子,完全可以用几行代码一个函数就能实现,那为什么要这么大费周章的分成好几个类呢?

总结:我们写程序总要考虑可维护性、复用性、可扩展性和健壮性几个方面。假如我们使用一个方法来实现计算器的+、-、*、/,那么将后续我们需要添加新的操作符(如平方根)时,我们就需要来重新更改这个方法,那么之前已经稳定运行的+、-法运行程序也需要给暴露出来,说不定你在不经意间就更改了原先的代码逻辑,这就多多少少带来错误的可能性。

当我们将+、-、*、/几个运算分离出来时,就实现了这几个的运算分离。如果要新加一个操作,我们只需要新加一个操作类,然后再CreateOperator.Create()函数中新加一个Switch分支条件即可。这样就保证了之前的代码逻辑不受更改及影响,减少了错误的发生几率。

NOTE: 本系列是阅读《大话设计模式》一书的学习笔记,旨在记录、加深自己学习过程中的理解。

时间: 2024-12-09 18:41:47

《大话设计模式》学习笔记系列--1. 简单工厂模式的相关文章

【设计模式学习笔记】 之 简单工厂模式

 简介:工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,拒绝客服端程序员通过new创建需要的实例,并且是通过使用一个共同的接口来指向新创建的对象,即接口引用指向实现类对象,是多态的灵活运用. 举例1[未使用工厂模式]: 一个家庭中有多辆汽车,这个家庭想去出游,需要先传一个Car到Family中持有,才能出游. 首先考虑多辆汽车,都有同样的ru

设计模式学习笔记(C++)---工厂模式

工厂模式:简单工厂模式.工厂方法模式.抽象工厂模式 1).简单工厂模式:主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类. typedef enum { T80 = 1, T99 }TankType; class Tank { public: virtual void message() = 0; }; class Tank80:public Tank { public: void message() { cout << "Tank80"

设计模式学习(二)——简单工厂模式、工厂模式、抽象工厂模式

最近抽时间将之前看过的"程序人生"公众号推送的一篇工厂模式的介绍进行了实践,为了加深自己理解,特将自己的学习理解记录于此.初识设计模式,就被设计模式的精妙深深吸引,感觉脱离设计模式的代码就失去了美丽.作为一个测试,平日写代码的机会肯定不如开发多,但是希望自己能通过努力逐步提升代码水平,有一天也能写出优美的代码.如果有对于工厂模式或其他设计模式感兴趣的朋友欢迎一起探讨. 一.简单工厂模式 定义:专门定义一个类用来创建其他类的实例,被创建的实例通常具有共同的父类. 场景一:恰巧今天,老大兴

Java设计模式学习笔记,二:工厂模式

工厂模式,主要实现了创建者和调用者的分离. 分类:1.简单工厂模式:2.工厂方法模式:3.抽象工厂模式. 核心:实例化对象时,用工厂方法代替new操作. 一.简单工厂模式 也叫静态工厂模式,工厂类中实现静态方法,根据入参,生产不同的产品,工程项目中常用. 工厂类作为类使用,产品类作为接口使用,具体产品实现接口,用来生产同一等级结构中的任意产品,当新增产品时,需要修改已有的代码. 1 package com.corey.factory.simpleFactory; 2 3 /** 4 * 产品类接

大话设计模式第二章---商场促销简单工厂模式、策略模式 PHP实现及对比

简单工厂模式: <?php abstract class Cash_super { abstract public function accept_cash(float $money); } class Cash_normal extends Cash_super { public function accept_cash(float $money) { return $money; } } class Cash_rebate extends Cash_super { private $_mon

《大话设计模式学习笔记》2:策略模式

商场促销示例: 1.策略类: public abstract class CashSuper { public abstract double AcceptCash(double money); } 2.具体策略类(以打折类为例): public class CashRebate:CashSuper { private double moneyRebate; public CashRebate(double moneyRebate) { this.moneyRebate = moneyRebat

【设计模式学习笔记】 之 抽象工厂模式

简介: 抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 举例:每个汽车4s店和某个品牌工厂之间的关系,每个汽车4s店只会卖同一品牌的汽车,但是如果这一品牌汽车销量不好,效益不佳,那么4s店可以更换进货的工厂,从而更换其售卖的品牌. 分析:每个品牌的汽车都有一个品牌工厂,这些工厂都有一个生产汽车的方法,4s店中应持有工厂的引用,所以这些汽车工厂都应该实现一个汽车工厂接口,这个4s店中持有汽车工厂的接口,以便更换汽车工厂改变品牌. 实现: 汽车工厂是用来生产汽车的,

大话设计模式C++实现一:简单工厂模式

#include <iostream> #include <cstdlib> using namespace std; class Operation { protected: double numberA; double numberB; public: double getA() { return numberA; } double getB() { return numberB; } void setA(double number) { numberA = number; }

大话设计模式学习笔记——面向对象基础

前言 好记性不如烂"笔头"系列--大话设计模式学习笔记 目录 面向对象基础 面向对象基础 什么是类与实例 一切事物皆为对象,即所有的东西老师对象,对象就是可以看到.感觉到.听到.触摸到.尝到.或闻到的东西.准确地说,对象是一个自包含的实体,用一组可识别的特性和行为来标识.面向对象编程,英文叫 Object-Oriented Programming,其实就是针对对象来进行编程的意思.类就是具有相同属性和功能的对象的抽象集合.实例就是一个真实的对象.比如我们属于'人'类,而个人就是'人'类