工厂模式和门面模式

1.3 工厂模式

  • 任何可以产生对象的方法或类,都可以称之为工厂,单例也是一种工厂,为什么有了new之后,还需要工厂呢?以汽车举例:
// 移动的接口
interface Moveable() {
    void go();
}

// 其他交通类实现移动类接口,例如这里的小汽车
class Car inplaments Mpveable {
    public void go() {
        System.out.println("Car run ...");
    }
}

1.3.1 简单工厂:产品维度扩展

/**
* 可扩展性不好,比如要添加一个火车的创建,就还需要添加一个方法
* 最简单的工厂是这个工厂既可以生产汽车,也可以生产其他交通工具
*/
public class SimpleFactor() {
    // 创建汽车
    public Car creatCar() {
    // 前置操作
        return new Car();
    }

    // 创建飞机
    public Plane creatPlane() {
    // 前置操作
        return new Plane();
    }
}

基于最简单的工程的改进:

// 单独生产car的工厂
public class CarFactor() {
    // 创建汽车
    public Car creatCar() {
    // 前置操作,比如打印日志
    System.out.println("创建了一个小汽车...");
        return new Car();
    }
}

public static void main(String[] args) {
    // 向上转型
    Moveable c = new CarFactory().creatCar();
    c.go();
}

改进后达到:

  1. 任意定制交通工具:继承Moveable
  2. 任意定制生产过程:Moveable -> XXXFactor.create();
  3. 任意定制产品一簇

1.3.2 抽象工厂- 方便产品族上的扩展

  • 这里举例,现代人产品族和魔法世界人产品族。现代人和魔法人都抽象出来食物,交通工具,武器三个组成的产品族
// 武器
public abstract class Weapon {
    abstract void fire();
}
// 交通工具
public abstract class Vehicle {
    abstract void run();
}
// 食物
public abstract class Food {
    abstract void printlnName();
}

// 抽象工厂
public abstract class AbstractFactory() {
    abstract Food createFood();
    abstract Vehicle createVehicle();
    abstract Weapon createWeapon();
}

// 具体工厂,可以是现代人工厂,可以是魔法世界人的工厂,继承自抽象工厂,实现扩展
public class  TrueFactory extents AbstractFactory {
    Food createFood() {
        // 根据不同工厂返回不同的食物,这里的现实世界人吃的面包类,继承自Food类。如果是魔法世界人的具体工厂,可以返回魔法世界人的食物
        return new Bread();
    }
    Vehicle createVehicle(){
        // 根据不同工厂返回具体的交通工具,Car类继承自Vehicle
        return new Car();
    }
    Weapon createWeapon(){
        // 根据不同工厂返回具体的武器,这里Ak47继承自Weapon
        return new Ak47();
    }
}

  • 一般来说在设计接口和抽象类时,秉承形容词概念用接口,名词概念用抽象类的方式

1.3.3 静态工厂:静态方法产生的,例如单例

1.3.4 Bean工厂(Spring):可以很方便的定制我们的产品

1.4 Facate门面模式

比如Controller需要杂糅很多的service,业务很复杂,那么可以让Controller调用门面层Facate,门面层封装service,负责和service打交道。这样如果有另外一个Controller进来,也只需要掉门面即可

1.5 Mediator调停者模式

解决Service和Service之间的复杂调用,比如一个service调用很多的service来完整自己的工作,另外一个service也是如此,那么引入一个内部协调者,类似居委会大妈

Facate和Mediator只是一种叫法,该门面(协调者)对外就是Facate的概念,对内就是Mediator的概念 -> 解耦

1.5.1 经典应用:消息中间件(Mediator)

产生消息的把消息扔到消息中间件,其他使用消息的,去消息中间件去拿,这个消息中间件就类似门面,扮演协调者的作用,进行了解耦

松散耦合: 门面模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。

原文地址:https://www.cnblogs.com/darope/p/12684933.html

时间: 2024-10-08 14:03:58

工厂模式和门面模式的相关文章

java设计模式5.组合模式、门面模式、享元模式、桥接模式

组合模式 在面向对象的语言中,树结构有着巨大的威力,一个基于继承的类型的等级结构便是一个数结构,一个基于合成的对象结构也是一个数结构.组合模式将部分与整体的关系用树结构表示出来,使得客户端把一个个单独的成分对象和由它们组合而成的合成对象同等看待. 抽象构建角色:一个抽象角色,给参加组合的对象规定一个接口,这个接口给出共有的接口及默认行为. 树叶构建角色:代表参加组合的树叶对象,没有子对象,定义参加组合的原始对象行为. 树枝构建角色:代表参加组合的有子对象的对象,并给出树枝构件对象的行为. 对于子

外观模式(门面模式)

医院的例子 现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其"分而治之",把一个系统划分为几个较小的子系统.如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号.门诊.划价.化验.收费.取药等.看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事情. 首先病人必须先挂号,然后门诊.如果医生要求化验,病人必须首先划价,然后缴费,才可以到化验部门做化验.化验后再回到门诊室. 上图描述的是病人在医院里的体验,图

设置模式之-门面模式 -心得随笔

如果一个接口需要调用多个方法才能实现一个功能,那么就可以把这些方法封装到一个方法中,方便使用接口的人调用,这就是门面模式 也可以是完成一个功能需要调用很多接口,然后把这些接口再封一层,封成一个接口,对外暴露 原文地址:https://www.cnblogs.com/kuibuqianli/p/10401022.html

设计模式解密(5)- 外观模式(门面模式)

1.简介 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用. 使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中方法,从而外观模式让客户和子系统之间避免了紧耦合. 外观模式的目的不是为了给子系统添加新的功能接口,而是为了让外部减少与子系统内多个模块的交互,松散耦合,从而让外部能够更简单地使用子系统. 外观模式的本质是:封装交互,简化调用. 英文:Facade 类型:结构型模式

java设计模式之外观模式(门面模式)

针对外观模式,在项目开发和实际运用中十分频繁,但是其极易理解,下面就简要介绍一下. 一.概念介绍 外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口.这种类型的设计模式属于结构性模式.为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用. 二.角色及使用场景 简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用.这个模式中,设计到3个角色. 1).门面角色:外观模式的核心.它被客户角色调用,它熟悉子系统的功

外观模式 门面模式 Facade 创建型 设计模式(十三)

外观模式(FACADE) 又称为门面模式 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口,这一接口使得这一子系统更加易于使用. 意图解析 随着项目的持续发展,系统基本上都是会往功能更全面的方向发展,那么也就意味着我们的系统将会变得更加复杂. 系统会被划分为多个单独的子系统,每个子系统完成一部分功能,通过分工协作完成全部功能. 一个子系统也可能进一步拆分为更小的几个子系统. 程序中的文件将会越来越多,相互关联也会变得更加复杂 当使用一个功能的时候,作为客户端 你需

设计模式(七)门面模式(Facade)-结构型

门面模式Facade 门面模式:统之间的接口.框架之间的衔接 (1)使用接口的形式来开发,不需要知道接口中内部方法的实现: (2)门面模式就是为子系统对外提供的一组接口提供一个统一的界面,使得其他系统对该系统的访问都通过这个统一的界面来完成. (3)当一个负载的系统需要对外提供接口时,就需要将对提供的接口统一封装在外观类里,供外系统使用. 门面模式原理图 门面模式原理图 不用门面设计模式的情况 Holiday.java public class Holiday { public double g

JS设计模式(门面模式)

<!--JS设计模式(门面模式)--> // 门面模式的概念:简化API接口 最经典的就是事件 // 做一件事情: 必须要调用2个函数分别是 a , b //案例:获得页面上多个元素并设置css样式 window.onload=function(){ setCss(["div1","div2","div3"],{ background:"blue", color:"#fff" }); } fun

设计模式——门面模式

用于将对复杂某系统的访问统一化, 避免客户端过多的干涉某系统及其子系统. package designpattern.structure.facade; public class Facade { Subsystemclass1 s1 = new Subsystemclass1(); Subsystemclass2 s2 = new Subsystemclass2(); Subsystemclass3 s3 = new Subsystemclass3(); public void method1