博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
工厂模式(Factory)
阅读量:6886 次
发布时间:2019-06-27

本文共 3801 字,大约阅读时间需要 12 分钟。

1、简单工厂

2、工厂方法
3、抽象工厂

简单工厂和工厂方法这俩个设计模式不做详细介绍,请各位看官自行百度,有大量的解释。再次我简单引用一下其他博客主对这三种模式的理解。

引言

简单工厂、工厂方法、抽象工厂都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽象取了出来,优化了系统的架构,并且增强了系统的扩展性。此篇博客是笔者对学完这三种模式之后一个小小的总结

简单工厂

简单工厂模式的工厂类一般是使用静态方法,通过接收的参数不同来返回不同的对象实例。不修改代码的话,是无法扩展的

优点:客户端可以免除直接创建产品对象的责任,而仅仅是“消费”产品。简单工厂模式通过这种做法实现了对责任的分割
缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了

工厂方法

工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品

优点:允许系统在不修改具体工厂角色的情况下引进新产品
缺点:由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量

抽象工厂

抽象工厂是应对产品族概念的。应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。比如,每个汽车公司可能要同时生产轿车、货车、客车,那么每一个工厂都要有创建轿车、货车和客车的方法

优点:向客户端提供一个接口,使得客户端在不必指定产品具体类型的情况下,创建多个产品族中的产品对象
缺点:增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性

以上是对三种方法的介绍和优缺点描述,接下来我们使用一个实例来说明抽象工厂的创建

设计说明

案例如下,手机厂商拥有屏幕和主板这俩条生产线,不同的手机厂商生产规格不同的产品(小米公司和苹果公司)

我们进行分析,俩家手机厂商,俩条生产线生产俩种设备

1

定义如下,首先我们定义一个抽象的工厂,这个工厂的方法包含

1、创建屏幕
2、创建主板
这个抽象工厂的作用主要是让继承他的子类 实现这俩个抽象方法

///     /// 抽象工厂类:提供创建不同品牌的手机屏幕和手机主板    ///     public abstract class AbstractFactory    {        //工厂生产屏幕        public abstract Screen CreateScreen();        //工厂生产主板        public abstract MotherBoard CreateMotherBoard();    }

2

定义手机屏幕和手机主板的的抽象方法,因为不同的厂商对产品规格不同,所以定义好抽象的基类,再交由各不同的厂商去实现功能,实现如相

///     /// 屏幕抽象类:提供每一品牌的屏幕的继承    ///     public abstract class Screen    {        public abstract void print();    }///     /// 主板抽象类:提供每一品牌的主板的继承    ///     public abstract class MotherBoard    {        public abstract void print();    }

不同厂商对屏幕和主板的实现类如下:

///     /// 苹果手机屏幕    ///     public class AppleScreen:Screen    {        public override void print()        {            Console.WriteLine("苹果手机屏幕!");        }    }    ///     /// 苹果手机主板    ///     public class AppleMotherBoard:MotherBoard    {        public override void print()        {            Console.WriteLine("苹果手机主板!");        }    }    ///     /// 小米手机屏幕    ///     public class XiaoMiScreen:Screen    {        public override void print()        {            Console.WriteLine("小米手机屏幕!");        }    }    ///     /// 小米手机主板类    ///     public class XiaoMiMotherBoard :MotherBoard    {        public override void print()        {            Console.WriteLine("小米手机主板!");        }

3

经过上面俩个步骤我们得到了不同商品的实现,现在我们还缺少一个东西,就是不同的商家对自己商品的获取实现

此时我们应该建立不同商家的工厂类,有俩个商家,我们就建立俩个工厂类,工厂中分别实现创建自己产品
实现的工厂要继承AbstractFactory

/// 小米手机工厂类    ///     public class XiaoMiFactory : AbstractFactory    {        ///         /// 生产小米手机屏幕        ///         /// 
public override Screen CreateScreen() { return new XiaoMiScreen(); } /// /// 生产小米手机主板 /// ///
public override MotherBoard CreateMotherBoard() { return new XiaoMiMotherBoard(); } }
///     /// 苹果手机工厂    ///     public class AppleFactory : AbstractFactory    {        ///         /// 生产苹果手机屏幕        ///         /// 
public override Screen CreateScreen() { return new AppleScreen(); } /// /// 生产苹果手机主板 /// ///
public override MotherBoard CreateMotherBoard() { return new AppleMotherBoard(); } }

4

内容创建完成,接下去我们就来进行结果的输出

//小米工厂生产小米手机的屏幕和主板            AbstractFactory xiaomiFactory = new XiaoMiFactory();            Screen xiaomiScreen = xiaomiFactory.CreateScreen();            xiaomiScreen.print();            MotherBoard xiaomiMotherBoard = xiaomiFactory.CreateMotherBoard();            xiaomiMotherBoard.print();            //苹果工厂生产苹果手机屏幕和主板            AbstractFactory appleFactory = new AppleFactory();            Screen appleScreen = appleFactory.CreateScreen();            appleScreen.print();            MotherBoard appleMotherBoard = appleFactory.CreateMotherBoard();            appleMotherBoard.print();

理解:

不同的商家拥有自己的工厂创建自己的产品
1、首先实例化商家工厂
2、创建不同的商品
3、调用商品功能

转载地址:http://zuabl.baihongyu.com/

你可能感兴趣的文章
display table 标签
查看>>
mysql 日志维护
查看>>
用 LFS 做极简高效的流媒体服务
查看>>
使用七牛云存储解决ios7.1的app部署问题 https
查看>>
云计算,网格计算,分布式计算,集群计算的区别
查看>>
在CentOS 6.5 环境下利用yum搭建LNMP环境
查看>>
Greenplum闰秒故障的分析解决
查看>>
iMatrix平台中组织结构树标签acsTags:tree用法
查看>>
WinForm多线程编程
查看>>
Hyperledger Fabric 客户端开发五
查看>>
spring的参数校验
查看>>
Nginx的URL Rewrite基本指令
查看>>
Properties属性文件操作工具类PropsUtil
查看>>
计算机系统要素 C4
查看>>
Mysql存储引擎
查看>>
每看一次自己写的代码都有一种重写的冲动
查看>>
androidManifest.xml问题
查看>>
升级ubuntu后nginx无法启动
查看>>
inux多线程顺序控制的示例
查看>>
SQLServer 2016安装时的错误:Polybase要求安装Oracle JRE 7更新51或更高版本
查看>>