一、简单工厂模式
来源:互联网 发布:怎么在淘宝上投诉店铺 编辑:程序博客网 时间:2024/04/25 09:26
1、概念
简单工厂模式(Simple Factory Pattern)又叫“静态工厂方法模式(Static FactoryMehtod Pattern)”,属于类的创建型模式,是专门定义一个类用来创建其他类的实例,被创建的实例通常具有共同的父类。
简单工程模式解决的问题是如何去实例化一个合适的对象。
2、核心思想
有一个专门的类来创建实例的过程。
3、具体实现
3.1 进销存类软件的收费功能
所有进销存类的收费功能都会有一个折扣功能,总得来说就是在原价的基础上进行一定的优惠,但实现方法却各种各样,如:全场九折,满300饭50...,而且商家会根据自身情况去调整优惠额度。这就对我们设计程序造成一定的困难。
设计思路:
1)最初级的考虑可能是这样的,在收费界面 添加一个 下拉列表 里面包含各种 打折方式。
2)高级点也许会想到,下拉列表中的类容可以从数据库或配置文件加载。
3)更高级的也许会把收费界面的‘折扣类别’下拉列表去掉,直接在后台设定好当前的打折方式,又程序自己判断用那种。
我们知道,每种打折方式都是一种算法,传入总金额,返回打折后的金额,最常见的考虑方式就是,每增加一种打折方式,就增加一个计算折扣的方法。然后在收费时进行判断应用那种打折方式,就调用那种算法。
实现方式:
1)建一个类里面包含各种计算金额的方法,在UI层实现这个类,根据当前的折扣方式调用不用的方法。这样做的话每次增加一个方法的话需要现在计算类中添加一个新的·计算方法,然后再在UI层代码中添加一个条件判断语句。这是完全的面相过程编程的方法,完全的为实现功能而设计代码,先不说每次有需求变化都要吧程序从头改到尾,就说如果需要修改需要把整个程序都暴露到修改人的面前,如果是一个人ok没关系,一般没人会自己给自己使坏,如果是多个人合作开发的程序,难免其他人在修改时改了不该改的东西。
2)运用面向对象的思维方式,封装、继承、多态,上面的实现方式实际也用了封装的思路,把各种算法封装到一个计算类中。这也是我们很多初级程序员的思维误区,以为用了面向对象的语言,写出来的程序就是面向对象的程序。其实面向对象更多来说是思想上的面向对象,思想上实现了面向对象,即使用非面向对象语言也可以写出面向对象的程序。废话少说,说正事:
· 面向对象的思维说简单点就是一切皆对象:我们把收费打折这件事情就看成一个对象:
//收费对象,这个对象的作用 就是 返回折后 金额,虽然打折方式有很多种,但根本上来讲 都是传入 原价返回 折后价,因此我们可以用 将其封装成抽象类,也可以用接口的方式
abstract class Shoufei
{
public abstract double GerResult(double money);
}
用继承的方式 实现各种 打折方式
//正常收费
class norMalCash:Shoufei
{
public override double acceptCash(double money)
{
return money;
}
}
//打折收费
class rebateCash:shoufei
{
//这个对象需要一个特性就是折扣率
private double moneyRebate=1d;
public CashRebate(double moneyRebate)
{
this.moneyRebate=moneyRebate;
}
//继承父类的收费
public override double acceptCash(double money)
{
return money*moneyRebate
}
........................其他算法同上。
}
下来我们在界面实现时就可以通过下面方法来实现:
static void Mian()
{
shoufei sh=null;
double yuanMoney=0d;
double zhehouMoney=0d;
switch(type)
{
//原价收费
case 0:sh=new norMalCash();break;
//打八折
cse 1:sh=new rebateCash(0.8);break;
...........................................//其他方法都类似
}
zhehouMOney=sh.acceptCash( yuanMoney);
}
3)上面的方法用面向对象的方法实现了,但有个缺点,一每次增加算法,既要增加算法类,还要修改界面,因此我们应该把 上面 实例化方法的 代码段提出来单独创建一 个类,用来实例化方法类。看出来了,简单工厂就是干这个事的:
calss factory
{
public static shoufei createCashAccept(string type)
{
shoufei sh=null;
switch(type)
{
//原价收费
case 0:sh=new norMalCash();break;
//打八折
cse 1:sh=new rebateCash(0.8);break;
...........................................//其他方法都类似
}
return sh;
}
}
这样界面端的实现代码 就会 改成以下方式
static void Mian()
{
shoufei sh=factory. createCashAccept(type);
double yuanMoney=0d;
double zhehouMoney=0d;
zhehouMOney=sh.acceptCash( yuanMoney);
}
这下后面的任何修改也不会影响到界面了。
而且如果要增加新的打折方式,只要增加心类就行了,不需要看到其他方法。
- 一、简单工厂模式
- 一 简单工厂模式
- 一、简单工厂模式
- (一)简单工厂模式
- (一)简单工厂模式
- 一 简单工厂模式
- 一、简单工厂模式
- 一、简单工厂模式
- 一、简单工厂模式
- 简单工厂模式(一)
- 工厂模式(一)--简单工厂模式
- 工厂设计模式一 简单工厂模式
- 模式一(简单工厂)
- 简单工厂模式(一)
- (一)简单工厂模式
- 设计模式一 简单工厂
- 简单工厂模式(一)
- (一)简单工厂模式
- Java基础复习三
- ScriptManager.RegisterStartupScript方法
- MATLAB教程转载——MATLAB读取HDF文件
- 接口中的方法
- selenium+python3-数据驱动测试示例
- 一、简单工厂模式
- 全排列拓扑排序
- Python 字典(Dictionary)
- HDFS上传与下载底层实现------>源码分析
- Gabor滤波器为什么能实现频率域加窗
- 用map做桶
- Sciter:创建Hello World
- ROS中的编译问题 "catkin_make" must be invoked in the root of workspace
- IsPostBack