JAVA设计模式——工厂模式【简单工厂模式、工厂方法模式、抽象工厂模式(1)

return str;

}catch (IOException e){

e.printStackTrace();

return “”;

}

}

}

//相当于一个客户端,发出订购

public class PizzaStore {

public static void main(String[] args) {

//使用简单工厂模式

new OrderPizza(new SimpleFactory());

System.out.println(“退出程序”);

}

}

静态工厂模式


代码演示:

//简单工厂类

public class SimpleFactory {

//根据orderType,返回对应的Pizza对象

public static Pizza createPizza2(String orderType){

Pizza pizza=null;

System.out.println(“使用简单工厂模式2”);

if(orderType.equals(“greek”)){

pizza=new GreekPizza();

pizza.setName(“希腊披萨”);

}else if(orderType.equals(“chesse”)){

pizza=new CheesePizza();

pizza.setName(“奶酪披萨”);

}else if(orderType.equals(“pepper”)){

pizza=new PepperPizza();

pizza.setName(“胡椒披萨”);

}

return pizza;

}

//简单工厂模式也叫静态工厂模式

}

public class OrderPizza2 {

Pizza pizza=null;

String orderType=“”;

//构造器

public OrderPizza2(){

do{

orderType=getType();

pizza=SimpleFactory.createPizza2(orderType);

//输出pizza

if(pizza!=null){ //订购成功

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 type:”);

String str=strin.readLine();

return str;

}catch (IOException e){

e.printStackTrace();

return “”;

}

}

}

工厂方法模式

======

一个新的需求:披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如北京的奶酪piza、北京的胡椒pizza或者是伦敦的奶酪pizza、伦敦的胡椒pizza。

**思路1:**使用简单工厂模式,创建不同的简单工厂类,比如BJPizzaSimpleFactory、LDPizzaSimpleFactory等等.从当前这个案例来说,也是可以的,但是考虑到项目的规模,以及软件的可维护性、可扩展性并不是特别好

**思路2:**使用工厂方法模式

工厂方法模式介绍

1)工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。

2)工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。

工厂方法模式应用案例

1)披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨﹐比如北京的奶酪pizza、北京的胡椒pizza或者是伦敦的奶酪pizza、伦敦的胡椒pizza

2)思路分析图解

3)代码演示

public class BJCheesePizza extends Pizza {

@Override

public void prepare() {

// TODO Auto-generated method stub

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

System.out.println("北京的奶酪pizza,准备材料 ");

}

}

public class BJPepperPizza extends Pizza {

@Override

public void prepare() {

// TODO Auto-generated method stub

setName(“北京的胡椒pizza”);

System.out.println(" 北京的胡椒pizza,准备材料 ");

}

}

public class LDPepperPizza extends Pizza{

@Override

public void prepare() {

// TODO Auto-generated method stub

setName(“伦敦的胡椒pizza”);

System.out.println("伦敦的胡椒pizza,准备材料 ");

}

}

public class LDCheesePizza extends Pizza{

@Override

public void prepare() {

// TODO Auto-generated method stub

setName(“伦敦的奶酪pizza”);

System.out.println(“伦敦的奶酪pizza,准备材料”);

}

}

public abstract class Pizza {

protected String name; //名字

//准备原材料,不同的披萨不一样,所以为抽象方法

public abstract void prepare();

public void bake() {

System.out.println(name + " baking;");

}

public void cut() {

System.out.println(name + " cutting;");

}

public void box() {

System.out.println(name + " boxing;");

}

public void setName(String name) {

this.name = name;

}

}

public abstract class OrderPizza {

//定义一个抽象方法,createPizza,让各个子类自己实现

abstract Pizza createPizza(String orderType);

//构造器

public OrderPizza() {

Pizza pizza = null;

String orderType; //订购披萨的类型

do {

orderType = getType();

pizza = createPizza(orderType); //抽象方法,由工厂子类完成

//输出pizza 制作过程

pizza.prepare();

pizza.bake();

pizza.cut();

pizza.box();

} 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 “”;

}

}

}

public class BJOrderPizza extends OrderPizza {

@Override

Pizza createPizza(String orderType) {

Pizza pizza = null;

if(orderType.equals(“cheese”)) {

pizza = new BJCheesePizza();

} else if (orderType.equals(“pepper”)) {

pizza = new BJPepperPizza();

}

// TODO Auto-generated method stub

return pizza;

}

}

public class LDOrderPizza extends OrderPizza {

@Override

Pizza createPizza(String orderType) {

Pizza pizza = null;

if(orderType.equals(“cheese”)) {

pizza = new LDCheesePizza();

} else if (orderType.equals(“pepper”)) {

pizza = new LDPepperPizza();

}

// TODO Auto-generated method stub

return pizza;

}

}

public class PizzaStore {

public static void main(String[] args) {

String loc = “bj”;

if (loc.equals(“bj”)) {

//创建北京口味的各种披萨

new BJOrderPizza();

} else {

//创建伦敦口味的各种披萨

new LDOrderPizza();

}

// TODO Auto-generated method stub

}

}

抽象工厂模式

======

基本介绍

l)抽象工厂模式:定义了一个interface接口用于创建相关或有依赖关系的对象簇,而无需指明具体的类

2)抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。

3)从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。

  1. 将工厂抽象成两层,AbsFactory(抽象工厂)和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。

5)类图

抽象工厂模式应用实例

使用抽象工厂模式完成披萨项目

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

public interface AbsFactory {

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

public Pizza createPizza(String orderType);

}

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;

}

}

//这是工厂子类

public class BJFactory implements AbsFactory {

@Override

public Pizza createPizza(String orderType) {

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

// TODO Auto-generated method stub

Pizza pizza = null;

if(orderType.equals(“cheese”)) {

pizza = new BJCheesePizza();

} else if (orderType.equals(“pepper”)){

pizza = new BJPepperPizza();

}

return pizza;

}

}

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;

} catch (IOException e) {

e.printStackTrace();

return “”;

}

}

}

public class PizzaStore {

public static void main(String[] args) {

// TODO Auto-generated method stub

//new OrderPizza(new BJFactory());

new OrderPizza(new LDFactory());

}

}

工厂模式JDK-Calendar源码分析

====================

JDK中的Calendar类中,就使用了简单工厂模式

总结

总的来说,面试是有套路的,一面基础,二面架构,三面个人。

最后,小编这里收集整理了一些资料,其中包括面试题(含答案)、书籍、视频等。希望也能帮助想进大厂的朋友

三面蚂蚁金服成功拿到offer后,他说他累了

三面蚂蚁金服成功拿到offer后,他说他累了

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 “”;

}

}

}

public class PizzaStore {

public static void main(String[] args) {

// TODO Auto-generated method stub

//new OrderPizza(new BJFactory());

new OrderPizza(new LDFactory());

}

}

工厂模式JDK-Calendar源码分析

====================

JDK中的Calendar类中,就使用了简单工厂模式

总结

总的来说,面试是有套路的,一面基础,二面架构,三面个人。

最后,小编这里收集整理了一些资料,其中包括面试题(含答案)、书籍、视频等。希望也能帮助想进大厂的朋友

[外链图片转存中…(img-vGbQrQLP-1714391527120)]

[外链图片转存中…(img-b3MQZ6hV-1714391527121)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值