ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【源码分析设计模式 2】JDK中的抽象工厂模式,记一次字节跳动Java研发岗的面试经历

2021-12-14 14:02:01  阅读:170  来源: 互联网

标签:guor Java System 源码 abstractFactory 设计模式 com public pizza


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

三、优缺点


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();

pizza.cut();

pizza.box();

} else {

System.out.println(“订购失败”);

break;

}

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

} while (true);

}

// 写一个方法,可以获取客户希望订购的披萨种类

private String getType() {

try {

BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));

System.out.println(“input pizza 种类:”);

String str = strin.readLine();

return str;

} catch (IOException e) {

e.printStackTrace();

return “”;

}

}

}

package com.guor.abstractFactory.order;

public class PizzaStore {

public static void main(String[] args) {

new OrderPizza(new BJFactory());

}

}

(2)pizza包包

package com.guor.abstractFactory.pizza;

public class BJCheesePizza extends Pizza {

@Override

public void prepare() {

setName(“北京的奶酪pizza”);

System.out.println(“北京的奶酪pizza 准备原材料”);

}

}

package com.guor.abstractFactory.pizza;

public class BJPepperPizza extends Pizza {

@Override

public void prepare() {

标签:guor,Java,System,源码,abstractFactory,设计模式,com,public,pizza
来源: https://blog.csdn.net/m0_64867896/article/details/121925848

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有