02. 02-工厂模式

0.例子基本介绍

看一个披萨的项目:要便于扩展,要便于维护

  1. 披萨的种类很多(GreekPizza,CheesePizza…)
  2. 披萨的制作有preapare,bake,cut,box
  3. 完成披萨店的订购功能

1 简单工厂模式

  • 基本介绍
  1. 简单工厂模式属于创建型模式,是工厂模式的一种,简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式是工厂模式家族中最简单实用的模式
  2. 简单工厂模式 :

定义了一个创建对象的类,由这个类来封装实例化对象的行为

  1. 在软件开发中,当我们会用到大量的创建某种,某类或某批对象时,就会使用到工厂模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CoGGWbfu-1659338161878)(evernotecid://922396D6-A2D4-4855-AB42-2F266892D557/appyinxiangcom/13689298/ENResource/p1369)]


1.1 代码
  • SimpleFactory
public class SimpleFactory {
    //static 类方法
    public static Pizza createPizza(String pizzaName){
        Pizza pizza = null;
        switch (pizzaName){
            case "GreekPizza" :
                pizza = new GreekPizza();
                pizza.setName("希腊披萨");
                break;
            case "PepperPizza" :
                pizza = new PepperPizza();
                pizza.setName("胡椒披萨");
                break;
            default:
                System.out.println("没有这个种类的披萨");
        }
        return pizza;
    }
}
  • PizzaStore

使用简单工厂方法

private static void simpleFactoryTest(){
        do {
            String pizzaName = getType();
            Pizza pizza = SimpleFactory.createPizza(pizzaName);
            if (pizza != null){
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            }else {
                System.out.println("订购披萨失败");
                break;
            }
        }while (true);
    }

  • 如果要增加新的种类,只需要对简单工厂类进行修改

2.工厂方法模式

  1. 新的需求 :

客户在点披萨时,可以点不同口味的披萨.比如 北京的奶酪pizza,北京的胡椒pizza,或者伦敦的奶酪pizza,伦敦的胡椒pizza.

2.思路

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

1. 工厂方法模式介绍
  1. 工厂方法模式设计方案 :

将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现.

2.工厂方法模式 :

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

在这里插入图片描述


2. 代码
  • OrderPizza
abstract Pizza createPizza(String orderType);
  • LDOrderPizza
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;
	}
}
  • main
public class PizzaStore {

	public static void main(String[] args) {
		String loc = "bj";
		if (loc.equals("bj")) {
			//创建北京口味的各种Pizza
			new BJOrderPizza();
		} else {
			//创建伦敦口味的各种Pizza
			new LDOrderPizza();
		}
		// TODO Auto-generated method stub
	}

}

3. 抽象工厂模式

  1. 抽象工厂模式

定义了一个interface用于创建相关或有依赖关系的对象簇,而无需知名具体的类

  1. 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合.
  2. 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者成为进一步的抽象)
  3. 将工厂抽象成两层,ABSFactory(抽象工厂)和具体实现的工厂子类. 程序员可以根据创建对象类型使用对应的工厂子类.这样讲单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展.
  4. 类图
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z0x4hvwN-1659338161885)(evernotecid://922396D6-A2D4-4855-AB42-2F266892D557/appyinxiangcom/13689298/ENResource/p1371)]

3.1代码
  • AbsFactory
//一个抽象工厂模式的抽象层(接口)
public interface AbsFactory {
    //让下面的工厂子类来具体实现
    public Pizza createPizza(String orderType);
}
  • BJFactory
// 实现接口的方法
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;
    }
}
  • OrderPizza
public class OrderPizza {
    AbsFactory factory;
    public OrderPizza(AbsFactory factory){
        setFactory(factory);
    }

    private void setFactory(AbsFactory factory){
        System.out.println("setFactory");
        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);
    }
  }
  • main
public class PizzaStore {
    public static void main(String[] args) {
        new OrderPizza(new BJFactory());
    }
}

4.工厂模式小结

  1. 工厂模式的意义

将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到主项目的依赖关系的解耦.从而提高项目的扩展和维护性.

  1. 三种工厂模式
  1. 简单工厂模式
  2. 工厂方法模式
  3. 抽象工厂模式

3.设计模式的依赖抽象原则

  1. 创建对象实例时,不要直接new 类, 而是把这个new 类的动作放在一个工厂的方法中,并返回.(变量不要直接持有具体类的引用)
  2. 不要让类继承具体类,而是继承抽象类或者实现interface(接口)
  3. 不要覆盖基类中已经实现的方法.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值