工厂模式,设计模式中普遍分成了三种,简单工厂、工厂方法和抽象工厂模式。
看到一个名字,我首先会去思考它为什么被人们起为这样的名字,对于设计模式,想要明白到底是怎么回事,当然也要从名字开始。
简单工厂,是针对同样具有某种属性和动作的对象进行抽象和封装的开始,简单工厂当然就是量少的工厂,我们完全可以项目的生存期中能够考虑到的为数不多的工厂整合到一个工厂类中,每一个工厂中,我们建造出特定的产品,这些产品都有共同的属性和动作,我们事先将他们写进一个抽象产品类中,以便客户端随时进行实例化其需要的产品,并且在日后的维护升级过程中,可以直接改动相应的产品类,而不影响到其他产品。
工厂方法,是简单工厂不再简单的时候,我们需要考虑的设计模式。在这里,我们不用将所有产品类考虑到我们的代码设计当中,再调用核心代码的客户端中,完全可以通过对工厂的抽象,随时添加新的工厂类来生产特定的新产品,轻轻松松对项目进行扩展。每一个产品类都可以对自身进行维护,修改自身的同时不会影响到其他产品的内容。让工厂依赖于抽象产品类,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
抽象工厂,是针对一系列产品进行改动,比如在我们修改windows系统主题的时候,当切换成蓝色格调,于是整个界面趋向于蓝色进行变化,包括按钮,文本,下拉框等等。
变动的不止是特定的产品,而是一个工厂创建了一系列相关的产品,这是对工厂方法的进一步扩展,是一个工厂创建特定产品族的内容。
在我们的管理系统中,有客服、资源合作部和技术部,在计算各部门薪水的时候可以与工厂模式进行结合,如下:
简单工厂:
1.抽象部门类Department定义公共的接口和字段
2.具体部门类计算各自的薪水并在控制台显示。
3.工厂类中,通过switch判断实例化相应的部门类,并返回此实例。
PS:可以通过反射机制通过类名实例化具体的部门类。
工厂方法:
1.与简单工厂不相同的地方就是对工厂类进行了抽象,工厂类依赖抽象部门类,而不涉及到具体部门,针对抽象进行编程,我们只是调用了各个部门公共的内容。
抽象工厂:
在业务进行中,我们需要每天都有相应的客服部门、资源合作部门在岗对客户进行服务,此时周末和节日放假来加班的客服、资源合作部人员的工资是不一样的,于是我们可以利用抽象工厂生产不同组的产业链进行薪水的计算:
1.从具体部门类中派生出周末组和节日组产业链,包括客服、资源合作部,每个产业链中都必须包括这两种角色。
2.抽象出工厂类,定义统一创建相应产品的接口。
3.派生出具体工厂类,生成不同产业链的产品族,即周末租和节日租的客服和资源合作部人员。
代码如下:
using System;using System.Collections.Generic;using System.Text;namespace DesignPattern{ abstract class Department { public double amount; public double ratio; public abstract string getMoney(); } class ServiceD : Department { public override string getMoney() { return "客服部:"+amount * ratio; } } class CooperativeD : Department { public override string getMoney() { return "资源合作部:"+amount * ratio + ",洽谈公司合作提成:"+20000 * ratio; } } class TeckD : Department { public override string getMoney() { return "技术部:"+amount * ratio ; } } ////// //class Factory //{ // public Department CreateDepartment(string str) // { // switch (str) // { // case "客服部": // return new ServiceD(); // case "资源合作部": // return new CooperativeD(); // case "技术部": // return new TeckD(); // default: // return null; // } // } //} ///简单工厂 ////// //abstract class Factory //{ // public abstract Department getDepartment(); //} //class ServiceF:Factory //{ // public override Department getDepartment() // { // return new ServiceD(); // } //} //class CooperativeF : Factory //{ // public override Department getDepartment() // { // return new CooperativeD(); // } //} //class TeckF : Factory //{ // public override Department getDepartment() // { // return new TeckD(); // } //} ///工厂方法 ////// class Servicegroup1 : ServiceD { public override string getMoney() { return "客服周末组:" + amount * ratio; } } class Servicegroup2 : ServiceD { public override string getMoney() { return "客服节日组:" + amount * ratio+"提成:"+amount*0.01; } } class Cooperativegroup1 : CooperativeD { public override string getMoney() { return "资源合作部周末组:" + amount * ratio; } } class Cooperativegroup2 : CooperativeD { public override string getMoney() { return "资源合作部节日组:" + amount * ratio + "提成:" + amount * 0.005; } } abstract class Factory { public abstract Department CreateServiceDepartment(); public abstract Department CreateCooperativeDepartment(); } class WeekendFactory : Factory { public override Department CreateServiceDepartment() { return new Servicegroup1(); } public override Department CreateCooperativeDepartment() { return new Cooperativegroup1(); } } class FestivalFactory : Factory { public override Department CreateServiceDepartment() { return new Servicegroup2(); } public override Department CreateCooperativeDepartment() { return new Cooperativegroup2(); } } class CreateEWChain { private Department service; private Department cooperative; public CreateEWChain(Department aService, Department aCooperative) { service = aService; cooperative = aCooperative; } public void run() { Console.WriteLine(service.getMoney()+"," + cooperative.getMoney()); } } class Program { static void Main(string[] args) { ///抽象工厂 ////// //Factory aFactory = new CooperativeF(); //Department aDepartment = aFactory.CreateDepartment("资源合作部"); //aDepartment.amount = 100000; //aDepartment.ratio = 0.02; //Console.WriteLine(aDepartment.getMoney()); ///简单工厂 ////// //Factory aFactory = new TeckF(); //Department aDepartment = aFactory.getDepartment(); //aDepartment.amount = 100000; //aDepartment.ratio = 0.02; //Console.WriteLine(aDepartment.getMoney()); ///工厂方法 ////// Factory aFactory = new FestivalFactory(); Department aDepartment = aFactory.CreateServiceDepartment(); aDepartment.amount = 100000; aDepartment.ratio = 0.02; Department anotherDepartment = aFactory.CreateCooperativeDepartment(); anotherDepartment.amount = 100000; anotherDepartment.ratio = 0.01; CreateEWChain aChain = new CreateEWChain(aDepartment, anotherDepartment); aChain.run(); } }}抽象工厂 ///
开始学习设计模式,有很多不妥和错误的地方,还请大家多多纠正。。。。。多谢了。
转载请注明出处: