c#简单工厂、工厂方法与抽象工厂的区别分析
发布时间:2021-11-30 04:39:47
有一个比较好理解的例子,在这跟大家介绍下:
1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了.
2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来.
3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当用抽象工厂,把各种各样的植物,又组成一个后花园.
所以我个人认为,简单工厂是一个工厂只生产一类的产品,面对的是具体的类,工厂方法是可以生产不同的产品,把公共的方法抽象出来,然后进行创建各种各样的产品.抽象工厂把几种产品划出共同的东西,把相互依赖的对象抽象出来,只要实现这些接口就可以得到不同的产品.
具体例子:
1.简单工厂:
using System;
public interface ICar
{
void run();
}
public class BMWCar : ICar
{
public void run()
{
Console.WriteLine("BMWCar run");
}
}
public class BenzCar : ICar
{
public void run()
{
Console.WriteLine("BenzCar run");
}
}
public class Driver
{
public static ICar DriverCar(string carType)
{
switch (carType)
{
case "BMWCar": return new BMWCar();
case "BenzCar": return new BenzCar();
default: throw new Exception();
}
}
}
public class Client
{
public static void Main()
{
ICar myCar = Driver.DriverCar("BenzCar");
myCar.run();
Console.Read();
}
}
心得:优点是只要实现共有的接口就可以实现不同车跑的方式.但缺点就是要判断哪一种车,造成要修改Driver 类
2.工厂方法:
using System;
public interface ICar
{
void run();
}
public class BMWCar : ICar
{
public void run()
{
Console.WriteLine("BMWCar run");
}
}
public class BenzCar : ICar
{
public void run()
{
Console.WriteLine("BenzCar run");
}
}
public abstract class Driver
{
public abstract ICar DriverCar();
}
public class BMWDriver : Driver
{
public override ICar DriverCar()
{
return new BMWCar();
}
}
public class BenzDriver : Driver
{
public override ICar DriverCar()
{
return new BenzCar();
}
}
class Client
{
public static void Main()
{
Driver myDriver = new BenzDriver();
ICar myCar = myDriver.DriverCar();
myCar.run();
Console.Read();
}
}
心得:优点是符合了开放-封闭原则(OCP),从整体上还看不出什么缺点.
3.抽象工厂:
using System;
public interface IBusinessCar
{
void run();
}
public interface ISportCar
{
void run();
}
public class BMWBusinessCar : IBusinessCar
{
public void run()
{
Console.WriteLine("BMWCar run");
}
}
public class BenzBusinessCar : IBusinessCar
{
public void run()
{
Console.WriteLine("BenzBusinessCar run");
}
}
public class BMWSportCar:ISportCar
{
public void run()
{
Console.WriteLine("BMWSportCar run");
}
}
public class BenzSportCar:ISportCar
{
public void run()
{
Console.WriteLine("BenzSportCar run");
}
}
public interface IDriver
{
IBusinessCar BusinessCarDriver();
ISportCar SportCarDriver();
}
public class BMWDriver:IDriver
{
public IBusinessCar BusinessCarDriver()
{
return new BMWBusinessCar();
}
public ISportCar SportCarDriver()
{
return new BMWSportCar();
}
}
public class BenzDriver:IDriver
{
public IBusinessCar BusinessCarDriver()
{
return new BenzBusinessCar();
}
public ISportCar SportCarDriver()
{
return new BenzSportCar();
}
}
class Client
{
public static void Main()
{
IDriver myDriver =new BenzDriver();
ISportCar myCar = myDriver.SportCarDriver();
myCar.run();
Console.Read();
}
}
心得:抽象方法似乎达到了完美境界.把开奔驰的司机和开宝马的司机的公共方法抽象出来,并对不同的司机创建不同的类,到时候不管是开什么车的司机随你添加.它们唯一的共同点都是开车.


猜你喜欢
- 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创
- java多线程-同步块Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java 同步块用来避免竞争。
- (注意:本文基于JDK1.8)前言元素在存储到内存中,当我们需要使用在内存中存储的元素,这就涉及到在内存中查找元素,今天一起学习Vector
- 1.简介本教程将介绍如何在Spring Security中设置身份验证提供程序,与使用简单UserDetailsService的标准方案相比
- 前言:来这家公司上班后,开始使用Git作为项目版本控制系统,由于以前用的是SVN,所以对Git也就简单学习了一下。但是,实践出真知,当开始使
- Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android
- 代码如果不进行格式化的处理,那么在查阅上会浪费不少的时间。今天我们要说的是字符串的格式化处理,作为基础编程内容,相信大家都字符串都不陌生。我
- 1. 接口是一种规范很好,你已经知道接口是一种规范了!下面这张图是我们生活中遇到的接口:电源插座接口。2. 为什么需要规范呢?因为
- 效果演示需求和技术分析RecyclerView Item拖拽排序::长按RecyclerView的Item或者触摸Item的某个按钮。Rec
- 短8位UUID思想其实借鉴微博短域名的生成方式,但是其重复概率过高,而且每次生成4个,需要随即选取一个。本算法利用62个可打印字符,通过随机
- 起因最近在写CRUD的时候,发现有个分页的VO写的健壮性比较差,一时手痒改了一下,没想到改了之后好几个功能都出现了问题。原VO关键代码如下:
- 业务现象代码中有一部分代码多次嵌套循环和数据处理,执行速度很慢解决方案通过多线程1、启用多线程private final static Ex
- java多线程的同步方法实例代码先看一个段有关银行存钱的代码:class Bank { private int su
- 这篇文章主要介绍了Java方法参数传递机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 本文实例讲述了Android观察者模式。分享给大家供大家参考。具体分析如下:一、环境:主机:WIN8开发环境:Eclipse二、说明:1.打
- 在还没给大家介绍单选按钮(RadioGroup)的使用,先给大家展示下效果图吧:xml文件 <LinearLayoutxmlns:an
- Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "hello";,另一种就是使用new
- 1.图的遍历从图中某一顶点出发访问图中其余顶点,且每个顶点仅被访问一次图的遍历有两种深度优先遍历DFS、广度优先遍历BFS2.深度优先遍历深
- 本文实例为大家分享了Android双向选择控件DoubleSeekBar的使用方法,供大家参考,具体内容如下先看效果图1.DoubleSli
- 创建类第一步新建一个java类QSV,构造函数传入需要解析的文件名称。public class QSV {private RandomAcc