设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难。你必须设计相关类,并设计类的接口和继承之间的关系。设计必须可以解决当前问题,同时必须对将来可能发生的问题和需求也有足够的针对性。掌握面向对象的设计模式,可以比较轻松的解决上述问题。

  本篇文章主要讲解设计模式中最基本,也是最常用的(Abstract Factory)抽象工厂。

  适用性:
  在以下情况可以使用Abstract Factory模式
  • 一个系统要独立于它的产品的创建、组合和表示时。
  • 一个系统要由多个产品系列中的一个来配置时。
  • 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
  • 当你提供一个产品类库,而只想显示它们的接口而不是实现时。

  举个例子讲解一下Abstract Factory主要应用场景。我们试想一下一辆轿车的制造过程,在最初学习面向对象编程时,我们会定义一个轿车类,里面封装了轿车的一系列属性,并且由轿车类自己将自己初始化。显然这样做足以应付当前需求,但是在将来的某一天我们需要设计一辆卡车呢?我们是不是必须再定义一个卡车类呢?这显然不符合可复用的软件设计思想。在面向对象的软件设计模式中,我们充分分析轿车和卡车的属性,抽象出一个公共的父类,并由轿车和卡车继承,再定义一个Factory类来实例化轿车和卡车。采用这样的设计模式,将来在增加自行车,摩托车等等只需定义它们的属性即可,它们的初始化过程不需要重新定义。

  结构:

下面我对上面问题进行一下具体讲解:

首先我们定义公共父类Vehicle:应为Vehicle 不需要实例化所以定义为抽象类。

    public abstract class Vehicle
{
private string name;
//品牌
public string Name
{
get { return name; }
set { name = value; }
}
private string color;
//颜色
public string Color
{
get { return color; }
set { color = value; }
}
public Vehicle()
{ }
public Vehicle(string name, string color)
{
this.Name = name;
this.Color = color;
}
public virtual int Price()
{
int price = ; return price;
}

定义轿车类Car继承Vehicle

   public class Car : Vehicle
{
private int seat;
//座位数
public int Seat
{
get { return seat; }
set { seat = value; }
}
public Car()
{ }
public Car(string name, string color, int seat) :
base(name, color)
{
this.Seat = seat;
}
public override int Price()
{
int price = ;
price = * Seat;
return price;
}
}

定义卡车类Truck继承Vehicle

        private int load;
//载重量
public int Load
{
get { return load; }
set { load = value; }
}
public Truck()
{ }
public Truck(string name, string color, int load)
: base(name, color)
{
this.Load = load;
}
public override int Price()
{
int price = ;
price = * Load;
return price;
}

它们之间的继承关系如下:

定义VehicleFactory类 初始化 轿车或卡车对象:

     /// <summary>
/// 工厂类
/// </summary>
public class VehicleFactory
{
public static Vehicle CreateVehicle(string name, string color, int seat, int load,string type)
{
Vehicle vehicle = null;
switch (type)
{
case "car":
vehicle = new Car(name, color, seat);
break;
case "truck":
vehicle = new Truck(name, color, load);
break;
}
return vehicle;
}

Abstract Factory模式有下面的一些优点和缺点:
1) 它分离了具体的类:

  Abstract Factory模式帮助你控制一个应用创建的对象的类。

2) 它使得易于交换产品系列

  一个具体工厂类在一个应用中仅出现一次—即在它初始化的时候。
3) 它有利于产品的一致性

  当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要。而Abstract Factory很容易实现这一点。
4) 难以支持新种类的产品

  难以扩展抽象工厂以生产新种类的产品。

  经过上面的讲解不知道大家对(Abstract Factroy)抽象工厂的模式设计是否有所了解呢?如果有什么地方看不懂的话可以与我联系。

  QQ:2584451009

设计模式——(Abstract Factory)抽象工厂“改正为简单工厂”的更多相关文章

  1. 一天一个设计模式——Abstract Factory抽象工厂模式

    一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...

  2. 设计模式 -- Abstract Factory 抽象工厂

    1.常规的对象创建方法 //创建一个Road对象 Road road=new Road(); new的问题:实现依赖,不能应对“具体实例化类型”额变化. 解决思想: 封装变化点--哪里变化,封装哪里( ...

  3. 2.设计模式-Abstract Factory 抽象工厂模式

    大神勿喷,不对的地方请指出来,学笔记而已. 解决的问题:应对多系列对象构建的变化或多系列(例如:崎岖的山路和平坦的马路属于一个系列) 不断的变化的创建. 使用场景:对象不变(比如有3个对象 " ...

  4. 设计模式02: Abstract Factory 抽象工厂(创建型模式)

    Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法:    //创建一个Road对象    Road road=new Road();    new的问题:    -实现依赖 ...

  5. Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

  6. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  7. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂

    简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...

  8. 设计模式之工厂模式之简单工厂(php实现)

    github源码地址: git@github.com:ZQCard/design_pattern.git 1.简单工厂模式 特点:将调用者与创建者分离,调用者直接向工厂请求,减少代码的耦合.提高系统的 ...

  9. 【LabVIEW技巧】工厂模式_简单工厂

    前言 上一个文章介绍了如何学习LabVIEW OOP,简要的提及了一些OOP学习中注意的事项,许多文章的读者反映写的太范,后文会逐步缩小范围,讨论在LabVIEW中各个模式的应用. 工厂模式概述 工厂 ...

随机推荐

  1. Windows下快速搭建安卓开发环境android-studio

    Windows下快速搭建安卓开发环境android-studio 发布时间:2018-01-18 来源:网络 上传者:用户 关键字: 安卓 搭建 Android Windows 快速 环境 Studi ...

  2. Cocos2d-x 3.2 Lua演示样本 ActionTest(操作测试)

    Cocos2d-x 3.2 Lua演示样本 ActionTest(操作测试) 2014年博文大赛,请投上您宝贵的一票:http://vote.blog.csdn.net/Article/Details ...

  3. 判断软件的闲置时间(使用Application.OnMessage过滤所有键盘鼠标消息)

    GetLastInputInfo是检测系统输入的,应用到某个程序中不合适! 此问题有二种解法来监控输入消息: 1.用线程级HOOK,钩上MOUSEHOOK与KEYBOARDHOOK 2.在Applic ...

  4. PCI GXL学习之二次开发篇

    作者:朱金灿 来源:http://blog.csdn.net/clever101 gxl的二次开发分初级和高级之分.初级是gxl提供了几百个模块供你编排成不同的作业.高级就是你可以编写你的算法模块,然 ...

  5. 设置npm淘宝镜像

    npm config set registry https://registry.npm.taobao.org

  6. 组态档(configuration file)与建构档

    组态档,或者叫 configuration file,配置文件.组态档是用一种建构软件专用的特殊编程语言写的 CMake 脚本. 使用组态档能改变程序的设置,而不用重新编译程序. CMake 的组态档 ...

  7. oracle授权grant

    alter any cluster 修改任意簇的权限 alter any index 修改任意索引的权限 alter any role 修改任意角色的权限 alter any sequence 修改任 ...

  8. 參数传递(引用,指针,值传递)C++11

    C++中,函数的參数传递方式有值传递.地址传递.传地址有指针和引用方式. 在函数參数中,传地址的理由有: 1.使被调函数能够改动主调函数中的数据对象: 2.传地址能够降低数据拷贝,提高程序运行速度. ...

  9. WPF 关于圆角的制作

    原文:WPF 关于圆角的制作 1.使用Boder(一般情况): 设置CornerRadius属性 <Border x:Name="border" CornerRadius=& ...

  10. Linux性能测试 dmesg命令

    dmesg 命令主要用来显示内核信息.使用 dmesg 可以有效诊断机器硬件故障或者添加硬件出现的问题.  另外,使用 dmesg 可以确定您的服务器安装了那些硬件.每次系统重启,系统都会检查所有硬件 ...