笔者福利
以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。
有了这个,面试踩雷?不存在的!
回馈粉丝,诚意满满!!!
提供了创建产品的接口,它包含多个创建产品的方法 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();
pizza.cut();
pizza.box();
} else {
System.out.println(“订购失败”);
break;
}
} 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;
写在最后
学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!
最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。
Mybatis面试专题
MySQL面试专题
并发编程面试专题
脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。
[外链图片转存中…(img-0tzpR1mV-1714877125727)]
Mybatis面试专题
[外链图片转存中…(img-O75a6GLl-1714877125728)]
MySQL面试专题
[外链图片转存中…(img-Qum1VWoa-1714877125728)]
并发编程面试专题