一、简单工厂模式

来源:互联网 发布:怎么在淘宝上投诉店铺 编辑:程序博客网 时间: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);

}


这下后面的任何修改也不会影响到界面了。

而且如果要增加新的打折方式,只要增加心类就行了,不需要看到其他方法。


0 0
原创粉丝点击