抽象工厂模式的运用
- 格式:doc
- 大小:69.00 KB
- 文档页数:10
实验五工厂方法模式、抽象工厂模式和生成器模式的应用一、实验目的通过该实验,理解工厂方法模式、抽象工厂模式和生成器模式的意图、结构,在软件开发中使用这些模式并进行功能验证。
二、实验内容1.手机工厂:现实中不同品牌的手机应由不同的工厂制造,使用工厂方法模式模拟实现。
图1 手机工厂的类图2.微型计算机配件的生产:该系统所需要的产品族有两个:PC系列和MAC系列,产品等级结构也有两个:RAM和CPU,使用抽象工厂模式模拟实现。
图2 微型计算机配件生产系统的设计类图3.用程序画一个小人:要求小人要有头、身体、手和脚。
使用生成器模式模拟实现。
图3 利用程序画小人的类图三、实验步骤与要求1.对于以上题目要认真分析和理解题意,程序中要求使用相应的模式。
2.上机录入,使用JDK编译器调试、运行、验证程序。
3.请指导教师审查程序和运行结果并评定成绩;4.撰写并上交实验报告。
四、实验原理:1、工厂方法模式当系统准备为用户提供某个类的子类的实例,又不想让用户代码和该子类形成耦合时,可以使用工厂方法模式来设计系统。
工厂方法模式的关键是在一个接口或抽象类中定义一个抽象方法,该方法返回某个类的子类的实例,该抽象类或接口让其子类或实现该接口的类通过重写这个抽象方法返回某个子类的实例。
适合使用工厂方法模式的情景有:●用户需要一个类的子类的实例,但不希望与该类的子类形成耦合●用户需要一个类的子类的实例,但用户不知道该类有哪些子类可用。
工厂方法模式的UML类图:图4 工厂方法模式的类图2、抽象工厂模式当系统准备为用户提供一系列相关的对象,又不想让用户代码和创建这些对象的类形成耦合时,就可以使用抽象工厂模式来设计系统。
抽象工厂模式的关键是在一个抽象类或接口中定义若干个抽象方法,这些抽象方法分别返回某个类的实例,该抽象类或接口让其子类或实现该接口的类重写这些抽象方法为用户提供一系列相关的对象。
适合使用抽象工厂模式的情景有:●系统需要为用户提供多个对象,但不希望用户直接使用new运算符实例化这些对象,即希望用户和创建对象的类解耦。
设计模式及其应用场景
设计模式是指在编写一个应用程序时,应该考虑的常见问题的可重复使用的解决方案。
它们是软件设计过程中最重要的工具,并且能够提高程序的可扩展性,可重用性和可维护性。
设计模式的应用场景包括:
1. 工厂模式:工厂模式可用于创建一组相关或依赖对象,通常是使用一个工厂类来管理操作,以避免将创建代码集成到应用程序中。
2. 抽象工厂模式:抽象工厂模式是工厂模式的进一步抽象,它用于创建一组抽象产品对象,而不需要明确指定具体的产品类。
3. 单例模式:单例模式是一种将一个类的实例限制为一个的设计模式,它可以保证一个类只有一个实例,并且该实例易于访问,以满足特定需求。
4. 命令模式:命令模式是一种将动作封装到对象中的设计模式,它将请求、动作(action)和接收者(receiver)分离,从而使得发送者和接收者之间形成解耦。
5. 观察者模式:观察者模式是一种行为设计模式,它允许一个对象(观察者)注册另一个对象(主题)的更改,以便在主题更改时收到通知。
抽象⼯⼚模式的优缺点和适⽤场景
抽象⼯⼚模式的优点
抽象⼯⼚模式除了具有⼯⼚⽅法模式的优点外,最主要的优点就是可以在类的内部对产品族进⾏约束。
所谓的产品族,⼀般或多或少的都存在⼀定的关联,抽象⼯⼚模式就可以在类内部对产品族的关联关系进⾏定义和描述,⽽不必专门引⼊⼀个新的类来进⾏管理。
抽象⼯⼚模式的缺点
产品族的扩展将是⼀件⼗分费⼒的事情,假如产品族中需要增加⼀个新的产品,则⼏乎所有的⼯⼚类都需要进⾏修改。
所以使⽤抽象⼯⼚模式时,对产品等级结构的划分是⾮常重要的。
适⽤场景
当需要创建的对象是⼀系列相互关联或相互依赖的产品族时,便可以使⽤抽象⼯⼚模式。
说的更明⽩⼀点,就是⼀个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着⼀定的关联或者约束,就可以使⽤抽象⼯⼚模式。
假如各个等级结构中的实现类之间不存在关联或约束,则使⽤多个独⽴的⼯⼚来对产品进⾏创建,则更合适⼀点。
总结
⽆论是简单⼯⼚模式,⼯⼚⽅法模式,还是抽象⼯⼚模式,他们都属于⼯⼚模式,在形式和特点上也是极为相似的,他们的最终⽬的都是为了解耦。
在使⽤时,我们不必去在意这个模式到底⼯⼚⽅法模式还是抽象⼯⼚模式,因为他们之间的演变常常是令⼈琢磨不透的。
经常你会发现,明明使⽤的⼯⼚⽅法模式,当新需求来临,稍加修改,加⼊了⼀个新⽅法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象⼯⼚模式了;⽽对于抽象⼯⼚模式,当减少⼀个⽅法使的提供的产品不再构成产品族之后,它就演变成了⼯⼚⽅法模式。
所以,在使⽤⼯⼚模式时,只需要关⼼降低耦合度的⽬的是否达到了。
抽象⼯⼚的应⽤实例——DbProviderFactory最近跟⼀些朋友讨论关于⼯⼚模式的⼀些东西,觉得很有必要写篇东西把抽象⼯⼚的应⽤⽅法写清楚。
GoF在抽象⼯⼚⼀章中没有花很多篇幅在如何应⽤抽象⼯⼚上。
所幸为我们提供了⼀个⾮常标准的抽象⼯⼚的例⼦,同时也是⾮常实⽤的⼀个接⼝——DbProviderFactory我希望借⼀个利⽤DbProviderFactory重构⽹站的例⼦来回答两个关于抽象⼯⼚的常见问题:1. 为什么要使⽤抽象⼯⼚2. 如何使⽤抽象⼯⼚⾸先我们来看看这个,这是我花1个⼩时写的⼀个很具有代表性的例⼦,⼀个数据库表,增删改查四个页⾯,查询页⾯⽤了控件我们可以不⽤管它,为了演⽰,增删改我没有使⽤FormView。
类似这样的⽹站随处可见,当然这并不是⼀个好的例⼦,没有异常处理,也没有任何封装,只是⼀个供⼤家理解的例⼦⽽已。
这是⼀个依赖于SqlSever Client的⽹站,我们⽆法把它部署在其它类型的数据库上。
现在让我们通过重构让它⽀持多种数据库。
使⽤抽象⼯⼚之前,⾸先要让代码符合OO的基本原则之⼀,。
所以我们把所有的命名空间System.Data.SqlClient全都换成mon,相应的类也换成以Db开头的接⼝。
然⽽不幸的是,当我们换完之后,会发现有语法错误:这些讨厌的new,我们没有办法创建⼀个接⼝的实例,所以new就没有办法不依赖具体的类。
这样,我们就不得不将原来的命名空间加回去了,⽽且也⽆法做到针对多种数据库编程。
到这⾥,你⼤概已经可以猜到解决⽅案跟⼯⼚有关了。
这就是我们使⽤⼯⼚的原因:构造函数不能多态。
接下来我们回到⽐较具体的问题,既然是⽤⼯⼚重构可以解决问题,如何做呢?当然是优先使⽤.net类库提供的抽象⼯⼚类:DbProviderFactory。
既然有了类,然后我们⾯临的具体问题就是:何时创建⼯⼚?保存⼯⼚的变量放在什么地⽅?让我们来考虑⼀下⼯⼚的在所⽤范围:这是⼀个很简单Web应⽤,我们只需要⼀个数据库,所以决定我们使⽤数据库类型的⼯⼚应该是全局的,在web应⽤程序启动时就创建。
策略模式简单工厂模式抽象工厂模式策略模式、简单工厂模式和抽象工厂模式是常见的设计模式,用于解决不同的问题和满足不同的设计需求。
下面将分别介绍这三种模式,并进行详细的比较。
策略模式策略模式是一种行为型模式,它将一组特定的算法封装成一个独立的类,使得它们可以相互替换。
应用策略模式的主要目的是让算法的变化独立于使用算法的客户端。
策略模式将算法的定义与算法的使用分离开来,这样可以让算法的定义更加灵活,能够根据需要动态地改变。
简单工厂模式简单工厂模式是一种创建型模式,它由一个工厂类负责创建不同类型的对象。
简单工厂模式的核心思想是将对象的创建过程封装起来,客户端只需要通过一个工厂类的方法来获取所需的对象,而不需要了解创建对象的细节。
简单工厂模式常常使用静态方法来创建对象,这样客户端可以直接通过类名来调用工厂方法。
抽象工厂模式也是一种创建型模式,它提供了一种创建一族相关或相互依赖对象的接口,而不需要指定具体的类。
抽象工厂模式的核心思想是将对象的创建过程封装到一个工厂接口中,具体的工厂类实现这个接口来创建不同的对象。
抽象工厂模式可以用于创建一系列的产品对象,这些产品对象有一定的关联关系。
比较1.目的不同:-策略模式的目的是将一组算法封装起来,使得它们可以相互替换。
-简单工厂模式的目的是封装对象的创建过程,使得客户端只需要通过一个工厂类的方法来获取所需的对象。
-抽象工厂模式的目的是提供一种创建一族相关或相互依赖对象的接口。
2.使用场景不同:-策略模式适用于一组特定的算法需要进行动态切换或扩展的场景。
-简单工厂模式适用于需要根据输入参数来决定创建具体对象的场景。
-抽象工厂模式适用于需要创建一系列相关或相互依赖的对象的场景。
3.灵活性不同:-策略模式的算法可以灵活地添加、删除或替换,客户端可以根据需要动态地选择所需的算法。
-简单工厂模式的创建过程在工厂类中,所以客户端只能通过修改工厂类代码来实现创建对象的变化,不够灵活。
【设计模式-⼯⼚模式】男男⼥⼥的抽象⼯⼚模式背景虽然⼥娲已经成功将⼈类创造出来了,可是都是没有性别的,那么后续该如何繁衍呢。
为此,除了增加⼈种外,我们还需要增加所有⼈类都有的⼀个属性:性别。
由此:⼈种和性别相互组合⽣成6中不同的⼈类男⿊⼈、⼥⿊⼈、男⽩⼈、⼥⽩⼈、男黄⼈、⼥黄⼈原来的⼀个⼋卦炉也需要进⾏修改,变为专门⽣产男性的"男⼋卦炉" 和专门⽣产⼥性的 “⼥⼋卦炉”类图可以看到我们在原有的⼏个⼈种上,⼜重新继承并实现了两个类,分别⽤于表⽰不同⼈种的男⼥特别说明的是HumanFactory接⼝,在这个接⼝中定义了三个⽅法,分别⽤于⽣产不同的肤⾊的⼈种,也就是我们将肤⾊作为Y轴,性别作为X轴,通过X坐标和Y坐标唯⼀确定⼀个⽣产出来的对象。
代码⼈种接⼝public interface Human {//每个⼈种的⽪肤都是不同的颜⾊public void getColor();//每个⼈类都会发声public void talk();public void getSex();}⼈种接⼝即抽象产品,该产品的共同属性定义:肤⾊和语⾔,⽽性别则是不同产品下更深层的细分实现⼈种接⼝的黄种⼈public abstract class AbstractYellowHuman implements Human{@Overridepublic void getColor() {System.out.println("黄种⼈");}@Overridepublic void talk() {System.out.println("国语");}}继承了该接⼝的抽象黄种⼈类,每个抽象类都会实现产品的公共细节,⽽每个抽象类的都会有两个实现类,分别实现各⾃的不同的细节:性别黄种⼈⼥性public class YellowWoman extends AbstractYellowHuman{@Overridepublic void getSex() {System.out.println("YellowWoman");}}⼋卦炉/*** 产品类* 有N个产品组,在抽象⼯⼚类中就应该有N个创建⽅法;* 每个产品有M个产品扩展维度就应该有M个产品实现⼯⼚类,* 在每个实现⼯⼚中,实现不同的产品族的⽣产任务.* @author LiPeng01* @since 2020/8/8 7:31 下午*/public interface HumanFactory {public Human doYellowHuman();public Human doWhiteHuman();public Human doBlackHuman();}在接⼝中我们可以看到 抽象的⼯⼚是可以⽣产出不同肤⾊的⼈种的。
⼯⼚模式简介和应⽤场景⼀、简介⼯⼚模式主要是为创建对象提供了接⼝。
⼯⼚模式按照《Java与模式》中的提法分为三类:1. 简单⼯⼚模式(Simple Factory)2. ⼯⼚⽅法模式(Factory Method)3. 抽象⼯⼚模式(Abstract Factory)⼆、简单⼯⼚模式我喜欢吃⾯条,抽象⼀个⾯条基类,(接⼝也可以),这是产品的抽象类。
public abstract class INoodles {/*** 描述每种⾯条啥样的*/public abstract void desc();}先来⼀份兰州拉⾯(具体的产品类):public class LzNoodles extends INoodles {@Overridepublic void desc() {System.out.println("兰州拉⾯上海的好贵家⾥才5 6块钱⼀碗");}}程序员加班必备也要吃泡⾯(具体的产品类):public class PaoNoodles extends INoodles {@Overridepublic void desc() {System.out.println("泡⾯好吃可不要贪杯");}}还有我最爱吃的家乡的⼲扣⾯(具体的产品类):public class GankouNoodles extends INoodles {@Overridepublic void desc() {System.out.println("还是家⾥的⼲扣⾯好吃 6块⼀碗");}}准备⼯作做完了,我们来到⼀家“简单⾯馆”(简单⼯⼚类),菜单如下:public class SimpleNoodlesFactory {public static final int TYPE_LZ = 1;//兰州拉⾯public static final int TYPE_PM = 2;//泡⾯public static final int TYPE_GK = 3;//⼲扣⾯public static INoodles createNoodles(int type) {switch (type) {case TYPE_LZ:return new LzNoodles();case TYPE_PM:return new PaoNoodles();case TYPE_GK:default:return new GankouNoodles();}}}简单⾯馆就提供三种⾯条(产品),你说你要啥,他就给你啥。
工厂模式的常见应用场景一、什么是工厂模式工厂模式是一种常见的设计模式,它可以将对象的创建和使用分离,使得我们可以在不了解具体实现细节的情况下创建对象。
它将对象的创建交给一个专门的工厂类来完成,这个工厂类负责根据不同的需求创建出不同类型的对象。
二、工厂模式的优点1. 可以降低代码耦合度:将对象创建和使用分离,使得客户端只需要知道产品接口就可以了,而无需知道具体实现细节。
2. 可以提高代码复用性:如果需要创建相似类型的对象,只需要修改工厂类即可。
3. 可以方便地进行单元测试:由于客户端只依赖产品接口而不依赖具体实现类,因此可以方便地进行单元测试。
三、工厂模式的常见应用场景1. JDBC中Connection对象的获取:JDBC中提供了一个DriverManager类来获取数据库连接。
这个类就是一个典型的工厂类,它根据不同类型的数据库驱动程序返回不同类型的Connection对象。
2. 日志框架中Logger对象的获取:日志框架中通常都会提供一个LoggerFactory类来获取Logger对象。
这个类也是一个典型的工厂类,它根据不同的日志实现返回不同类型的Logger对象。
3. Spring框架中Bean对象的获取:Spring框架中采用了IoC(控制反转)和DI(依赖注入)的方式来管理Bean对象。
在Spring中,我们可以通过配置文件或者注解来定义Bean对象,然后由Spring容器来负责创建和管理这些Bean对象。
4. 图形界面编程中控件对象的获取:图形界面编程中通常都会提供一个工厂类来创建控件对象,例如Swing框架中提供了一个JFrame类来创建窗口对象,JPanel类来创建面板对象等。
5. 游戏开发中角色对象的获取:游戏开发中通常都会提供一个工厂类来创建角色对象,例如《魔兽世界》游戏中就有一个CharacterFactory类来创建各种角色。
四、工厂模式的实现方式1. 简单工厂模式:简单工厂模式是一种最简单、最常用的工厂模式。
实验三抽象工厂模式的运用一、实验目的:抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
在熟悉抽象工厂模式相关理论知识的基础上,使用抽象工厂模式实现“电脑配置商店”程序。
二、实验要求:使用抽象工厂模式实现“电脑配置商店”,要求如下:1.电脑由CPU、主板、显卡、内存、硬盘等配件组合而成。
现电脑配置有两种配置方案。
2.根据配置方案可以显示具体配置信息。
3.根据配置方案可以显示价格。
1、设计并绘制该程序的类图;2、依照设计的类图使用Java语言编写代码,并实现该程序;3、除了核心的模式相关类实现外,提供测试环境,按照难度高低,分别是:a)控制台程序,Client硬编码初始化模式和测试环境,运行结果文本输出;b)控制台程序,Client初始化测试环境,并根据用户输入运算,运行结果文本输出;c)设计并实现用户UI,Client初始化测试环境,并根据用户在UI控件上的输入运算,运行结果文本输出;三、实验内容:类图代码public abstract class Computer_store {Computer_factory computer;public abstract Computer_factory createComputer(String type) ;}Computer_factory.javapublic interface Computer_factory {public Cpu createCpu();public Mainboard createMainboard();public GraphicsCard createGraphicsCard();public Ram createRam();public Harddisk createHarddisk();public void displayPrice();}电脑制造public class Plan_A_factory implements Computer_factory{ public Plan_A_factory(){System.out.println("\n配置方案一:");}public Cpu createCpu() {// TODO 自动生成的方法存根return new Plan_A_Cpu();}public Mainboard createMainboard() {// TODO 自动生成的方法存根return new Plan_A_Mainboard();}public GraphicsCard createGraphicsCard() {// TODO 自动生成的方法存根return new Plan_A_GraphicsCard();}public Ram createRam() {// TODO 自动生成的方法存根return new Plan_A_Ram();}public Harddisk createHarddisk() {// TODO 自动生成的方法存根return new Plan_A_Harddisk();}public void displayPrice() {// TODO 自动生成的方法存根System.out.println("RMB:4000:");}}public class Plan_B_factory implements Computer_factory{public Plan_B_factory(){System.out.println("\n配置方案二:");}public Cpu createCpu() {// TODO 自动生成的方法存根return new Plan_B_Cpu();}public Mainboard createMainboard() {// TODO 自动生成的方法存根return new Plan_B_Mainboard();}public GraphicsCard createGraphicsCard() {// TODO 自动生成的方法存根return new Plan_B_GraphicsCard();}public Ram createRam() {// TODO 自动生成的方法存根return new Plan_B_Ram();}public Harddisk createHarddisk() {// TODO 自动生成的方法存根return new Plan_B_Harddisk();}public void displayPrice() {// TODO 自动生成的方法存根System.out.println("RMB:5000");}}配置接口Cpu.javapublic interface Cpu {String Cpu=new String();}GraphicsCard.Javapublic interface GraphicsCard {String GraphicsCard=new String();}Mainboard.javapublic interface Mainboard {String Mainboard=new String();}Ram.javapublic interface Ram {String Ram =new String();}接口实现public class Plan_A_Cpu implements Cpu{ String Cpu=new String();public Plan_A_Cpu(){Cpu="AMD FX-8350";System.out.println("Cpu:"+Cpu);}}public class Plan_A_GraphicsCard implements GraphicsCard{ String GraphicsCard=new String();public Plan_A_GraphicsCard(){GraphicsCard="微星GTX 970";System.out.println("GraphicsCard:"+GraphicsCard);}}public class Plan_A_Harddisk implements Harddisk{String Harddisk=new String();public Plan_A_Harddisk(){Harddisk="IDE";System.out.println("Harddisk:"+Harddisk);}}public class Plan_A_Mainboard implements Mainboard{ String Mainboard=new String();public Plan_A_Mainboard(){Mainboard="ASUS";System.out.println("Mainboard:"+Mainboard);}}public class Plan_A_Ram implements Ram{String Ram=new String();public Plan_A_Ram(){Ram="2g";System.out.println("Ram:"+Ram);}public class Plan_B_Cpu implements Cpu {String Cpu=new String();public Plan_B_Cpu(){Cpu="intel i5";System.out.println("Cpu:"+Cpu);}}public class Plan_B_GraphicsCard implements GraphicsCard{ String GraphicsCard=new String();public Plan_B_GraphicsCard(){GraphicsCard="影驰GT730";System.out.println("GraphicsCard:"+GraphicsCard);}}public class Plan_B_Harddisk implements Harddisk{String Harddisk=new String();public Plan_B_Harddisk(){Harddisk="SATE";System.out.println("Harddisk:"+Harddisk);}}public class Plan_B_Mainboard implements Mainboard{ String Mainboard=new String();public Plan_B_Mainboard(){Mainboard="GIGABYTE";System.out.println("Mainboard:"+Mainboard);}}public class Plan_B_Ram implements Ram{String Ram=new String();public Plan_B_Ram(){Ram="4g";System.out.println("Ram:"+Ram);}}电脑基类public class Computer extends Computer_store {public Computer_factory createComputer(String type){ Computer_factory computer=null;if(type.equals("配置方案一")){computer=new Plan_A_factory();}else if(type.equals("配置方案二")){computer=new Plan_B_factory();}computer.createCpu();computer.createGraphicsCard();computer.createHarddisk();computer.createMainboard();computer.createRam();computer.displayPrice();return computer;}import java.util.Scanner;public class TEST {public static void main(String[] args) {// TODO 自动生成的方法存根Computer c=new Computer ();Scanner sc = new Scanner(System.in);for(int p=0;p<1;){System.out.println("输入选项选择不同的电脑配置方案 1,配置方案一 2,配置方案二");String k = sc.nextLine();switch(k){case "1":c.createComputer("配置方案一");break;case "2":c.createComputer("配置方案二");break;case "Q":p=2;sc.close();break;default:System.out.println("更新方案中,请选择方案一或方案二");break;}}}四、实验总结:通过本次实验认识了抽象工厂模式用于创建相关或依赖对象的家族,而不需要明确指定具体类。