抽象工厂模式相关知识
-
抽象工厂模式抽象工厂模式介绍:抽象工厂模式(Abstract Factory Pattern)起源于以前对不同操作系统的图形化解决方案,如不同的操作系统中的按钮和文件框控件其实现不同,展示效果也不一样,对于每个操作系统,其本身就构成一个产品类,而按钮和文本框控件也构成一个产品类,两种产品类两种变化,各自有各自的特点,如Android 中的Button 和TextView,iOS中的Button 和 TextView,Windows Phone中的Button 和TextView等。抽象工厂模式的定义:为创建一组相关或是相互依赖的对象提供一个接口,而不需要指定它们的具体类。抽象工厂模式的UML类图:image.png由UML图可以得出如下抽象工厂模式的通用模式代码。抽象产品类A/** * @ClassName AbstractProductA * @Description 抽象产品类A * @Author lm *
-
抽象工厂模式-示例接上文抽象工厂 模式模式讲解,本文主要从具体示例来复现该设计模式:由上文可知,抽象工厂模式的UML图如下:image.png【1】情景假设:假设现在有一个奥迪造车工厂,生产的车系有Q3,Q5,Q7三种不同型号但同属于Q系列的轿车,虽然同属于Q系列轿车,但三者车型的零部件差别还是很大,比如Q3和Q7对比,Q3使用的发动机是国产的,Q7使用的是原装进口,Q3使用的轮胎是普通轮胎,Q7使用的是全尺寸越野轮胎,Q3使用的是比较普通的制动系统,而Q7使用的是制动性能杠杠的制动系统。Q3和Q7对应的是一系列车,而发动机,轮胎,制动系统则对应的是一系列的零部件,两者是两种不同的产品类型,上文说过,抽象工厂的定义是为创建一组相关或者相互依赖的对象提供一个接口,而不需要指定它们的具体实现类。结合该情景,我们可以使用抽象工厂模式。具体示例UML图:image.png1)首先,汽车工厂需要生产发动机,轮胎,制动系统这3种零部件。抽象汽车工厂类:package com.company.designModel.sample
-
设计模式--工厂模式--抽象工厂模式工厂模式有2种:工厂方法模式、抽象工厂模式 *工厂方法模式:一个产品系列 *抽象工厂模式:一个产品族(包含多个系列) 2.抽象工厂模式的实现:以华为系列手机为例 - 定义接口(青春版) public interface YoungInterface { public void drawYoung(); } - 定义接口(标配版) public interface StandardInterface { public void drawStandard(); } - P9实现(青春版)接口 public class P9Young implements YoungInterface { @Override public void drawYoun
-
设计模式第3弹:抽象工厂模式1、 抽象工厂模式概述 抽象工厂模式(Abstract Factory)[GOF95]是一种对象的创建模式,是在工厂方法模式上的又一次改进,主要应用于多等级产品结构的项目架构中,将产品对象的创建过程和产品对象的使用过程解耦合,使用抽象工厂模式的架构中业务模型从工厂对象中获取到产品对象,只需要关注产品对象的使用即可,而可能添加了较为复杂业务逻辑的创建过程封装在工厂内部,让系统中各个模块的责任更加明确。 1.1、 核心组件 抽象工厂模式中的核心组件,主要是对多等级类型架构的一种解决方案
抽象工厂模式相关课程
抽象工厂模式相关教程
- 抽象工厂模式 抽象工厂模式用来解决产品族的实例化问题。比如说现在有个家居设计软件,通过软件模拟房间,摆放各种虚拟的家具,看效果如何。我们可以放入电视柜、茶几、餐桌、床等等。这一系列的家具就叫做产品族。产品族面临的问题是,当一个产品族切换到另外一个产品族时,如何让代码的修改最小。也就是说如何做到开闭原则。想把设计好的方案从简约现代切换到欧式风格家具,怎么才能做到修改最小?如果采用简单工厂,那么每种产品都对应一个工厂,工厂负责产出不同风格的产品。设计方案中用到 n 种产品就要修改 n 处代码。这显然不是最佳的方法。此时,我们需要抽象工厂模式来解决这个问题。抽象工厂模式中,每个工厂的实现负责生产自己产品族的产品。示意图如下:
- 工厂模式 工厂模式是平时开发过程中最常见的设计模式。工厂模式解决类的实例化问题,它属于创建型模式。工厂模式也经常会和其他设计模式组合使用。试想你去麦当劳买一个汉堡。你只需要告诉收银员要一个xx汉堡。过一会就会有一个此类型的汉堡被制作出来。而你完全不需要知道这个汉堡是怎么被制作出来的。这个例子中你就是客户端代码,麦当劳就是工厂,负责生产汉堡。汉堡是接口,而具体的某一种汉堡,比如说香辣鸡腿堡,就是实现了汉堡接口的类。我们继续通过另外一个例子,深入理解工厂模式。现在我们给某款音乐软件开发一个推荐功能。需求是能够根据用户选择的音乐风格,推荐不同风格的歌曲清单。那么你打算怎么实现呢?
- 1. 实现抽象工厂 为了便于理解和展示,我们假设只有两种家具----椅子和桌子。首先定义每种家具的接口,只有一个方法用来获取家具说明。椅子:public interface Chair { void getChairIntroduction();}桌子:public interface Desk { void getDeskIntroduction();}以椅子为例,我们分别实现简约现代和欧式两种风格。简约现代风格椅子:public class ModernStyleChair implements Chair { @Override public void getChairIntroduction() { System.out.println("这是一个现代简约风格的椅子"); }}欧式风格椅子:public class EuropeanStyleChair implements Chair { @Override public void getChairIntroduction() { System.out.println("这是一个欧式风格的椅子"); }}桌子也有两种实现,代码这里省略。产品我们已经编写完成。接下来我们来看看工厂的代码。首先我们定义一个家具工厂接口,可以生产椅子和桌子:public interface FurnitureFactory { Chair createChair(); Desk createDesk();}由于我们支持两种不同的风格,所以我们编写两个实现类。简约风格家具工厂:public class ModernFurnitureFactory implements FurnitureFactory{ @Override public Chair createChair() { return new ModernStyleChair(); } @Override public Desk createDesk() { return new ModernStyleDesk(); }}欧式风格家具工厂:public class EuropeanFurnitureFactory implements FurnitureFactory{ @Override public Chair createChair() { return new EuropeanStyleChair(); } @Override public Desk createDesk() { return new EuropeanStyleDesk(); }}上面的代码中,每种工厂各自实现如何生产两种不同的家具。客户端代码如下:public class Client { public static void main(String[] args) { FurnitureFactory furnitureFactory = new EuropeanFurnitureFactory(); Chair chair = furnitureFactory.createChair(); Desk desk = furnitureFactory.createDesk(); chair.getChairIntroduction(); desk.getDeskIntroduction(); }}客户端代码中,我们实例化的是欧式家具工厂,那么所生产的椅子和桌子应该是欧式风格。执行后输出如下:这是一个欧式风格的椅子这是一个欧式风格的桌子和我们的预期相符。如果想要更换产品族,从现代简约切换到欧式,我们只需要修改一处代码。FurnitureFactory furnitureFactory = new ModernFurnitureFactory();仅通过更换抽象工厂的实现即可实现。修改后执行结果如下:这是一个现代简约风格的椅子这是一个现代简约风格的桌子可以看到已经切换到简约风格的产品族。这个过程中并不需要改任何产品使用的代码。如果增加别的风格产品族,只需要新建新风格的产品族产品,增加新风格产品族的工厂实现即可。类图:
- 6.1 模式的介绍 该模式定义了一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构,它是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
- 3. 策略模式与工厂模式结合使用 针对第一个缺点。我们可以通过策略模式与工厂模式结合使用来改进。通过进一步封装,消除客户端代码的条件选择。我们修改一下StrategyContext类,代码如下:public class StrategyContext { private TravelStrategy strategy; public StrategyContext(String travelWay) { if ("selfDriving".equals(travelWay)) { strategy = new SelfDrivingStrategy(); } if ("bicycle".equals(travelWay)) { strategy = new BicycleStrategy(); } else { strategy = new PublicTransportStrategy(); } } public int calculateMinCost(){ return strategy.calculateMinCost(); }}可以看到我们初始化的逻辑和工厂的逻辑很相似。这样条件判断就提炼到 Context 类中了。而客户端代码将会简洁很多,只需要在初始化 StrategyContext 时,传入相应的出行方式即可。代码如下:public class TravelService { private StrategyContext strategyContext; public int calculateMinCost(String travelWay){ strategyContext = new StrategyContext(travelWay); return strategyContext.calculateMinCost(); }}改进后,客户端代码现在已经完全不知道策略对象的存在了。条件判断也被消除了。其实很多时候我们都是通过搭配不同设计模式来达到我们的设计目标的。策略+工厂模式类图如下:
- 7. 对象工厂 objectFactory MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)来完成。MyBatis 默认的对象工厂仅仅只是实例化目标类,我们可以自定义一个对象工厂类来覆盖默认的对象工厂。配置如下:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <objectFactory type="org.mybatis.example.ExampleObjectFactory"/></configuration>绝大多数情况下,这个操作都是极其危险的,改变了 MyBatis 默认的对象创建行为可能会带来一定的兼容错误,所以我们不做过多介绍,如果你确实需要它,可以查阅相关的资料。
抽象工厂模式相关搜索
-
c 正则表达式
c string
c 编程
c 程序设计
c 程序设计教程
c 多线程编程
c 教程
c 数组
c 委托
c 下载
c 线程
c 语言
caidan
cakephp
call
calloc
calu
camera
caption
case语句