【源码分析设计模式 2,消息中间件的四种投递模式对比

  • 系统中有多个产品族, 每个具体工厂创建同族但属于不同等级的产品;

  • 系统一次只可能消费其中某一族产品,即同族的产品一起使用。

二、抽象工厂模式的结构


抽象工厂模式同工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品和具体产品等 4 个要素构成,但抽象工厂中方法个数不同,抽象产品的个数也不同。

抽象工厂模式的主要角色如下:

1、抽象工厂

提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。

2、具体工厂

主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。

3、抽象产品

定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。

4、具体产品

实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。

三、优缺点


1、优点

  • 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类进行管理;

  • 当增加一个新的产品族时不需要修改原代码,满足开闭原则。

2、缺点

当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。

四、《Head First 设计模式》读后感


1、抽象工厂模式提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

2、工厂方法模式运用的是继承,抽象工厂模式运用的是对象的组合。

五、JDK源码分析



package com.guor.jdk;



import java.util.Calendar;



public class Factory {

    public static void main(String[] args) {

        Calendar cal = Calendar.getInstance();

        // 注意月份下标从0开始,所以取月份要+1

        System.out.println("年:" + cal.get(Calendar.YEAR));

        System.out.println("月:" + (cal.get(Calendar.MONTH) + 1));

        System.out.println("日:" + cal.get(Calendar.DAY_OF_MONTH));

        System.out.println("时:" + cal.get(Calendar.HOUR_OF_DAY));

        System.out.println("分:" + cal.get(Calendar.MINUTE));

        System.out.println("秒:" + cal.get(Calendar.SECOND));

    }

}

六、代码实例


1、UML类图

2、代码架构

3、具体代码

(1)order包包


package com.guor.abstractFactory.order;



import com.guor.abstractFactory.pizza.Pizza;



//一个抽象工厂模式的抽象层(接口)

public interface AbsFactory {

	//让下面的工厂子类来 具体实现

	public Pizza createPizza(String orderType);

}

package com.guor.abstractFactory.order;

import com.guor.abstractFactory.pizza.BJCheesePizza;

import com.guor.abstractFactory.pizza.BJPepperPizza;

import com.guor.abstractFactory.pizza.Pizza;

//这是工厂子类

public class BJFactory implements AbsFactory {

@Override

public Pizza createPizza(String orderType) {

	System.out.println("~使用的是抽象工厂模式~");

	Pizza pizza = null;

	if(orderType.equals("cheese")) {

		pizza = new BJCheesePizza();

	} else if (orderType.equals("pepper")){

		pizza = new BJPepperPizza();

	}

	return pizza;

}

}


package com.guor.abstractFactory.order;



import com.guor.abstractFactory.pizza.LDCheesePizza;

import com.guor.abstractFactory.pizza.LDPepperPizza;

import com.guor.abstractFactory.pizza.Pizza;



public class LDFactory implements AbsFactory {

	@Override

	public Pizza createPizza(String orderType) {

		System.out.println("~使用的是抽象工厂模式~");

		Pizza pizza = null;

		if (orderType.equals("cheese")) {

			pizza = new LDCheesePizza();

		} else if (orderType.equals("pepper")) {

			pizza = new LDPepperPizza();

		}

		return pizza;

	}

} 

package com.guor.abstractFactory.order;

import com.guor.abstractFactory.pizza.Pizza;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

public class OrderPizza {

AbsFactory factory;

// 构造器

public OrderPizza(AbsFactory factory) {

	setFactory(factory);

}



private void setFactory(AbsFactory factory) {

	Pizza pizza = null;

	String orderType = ""; // 用户输入

	this.factory = factory;

	do {

		orderType = getType();

		// factory 可能是北京的工厂子类,也可能是伦敦的工厂子类

		pizza = factory.createPizza(orderType);

		if (pizza != null) { // 订购ok

			pizza.prepare();

			pizza.bake();

最后

由于篇幅限制,小编在此截出几张知识讲解的图解,有需要的程序猿(媛)可以点赞后戳这里免费领取全部资料获取哦

P8级大佬整理在Github上45K+star手册,吃透消化,面试跳槽不心慌

P8级大佬整理在Github上45K+star手册,吃透消化,面试跳槽不心慌

P8级大佬整理在Github上45K+star手册,吃透消化,面试跳槽不心慌

P8级大佬整理在Github上45K+star手册,吃透消化,面试跳槽不心慌

P8级大佬整理在Github上45K+star手册,吃透消化,面试跳槽不心慌

izza.bake();

最后

由于篇幅限制,小编在此截出几张知识讲解的图解,有需要的程序猿(媛)可以点赞后戳这里免费领取全部资料获取哦

[外链图片转存中…(img-6PH9G3cK-1628603530184)]

[外链图片转存中…(img-m1BYmmv2-1628603530186)]

[外链图片转存中…(img-LWoysW5p-1628603530188)]

[外链图片转存中…(img-uuEfJHIo-1628603530191)]

[外链图片转存中…(img-6piUZ4rt-1628603530193)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值