设计模式之工厂模式(创建型模式)

目录

一、简单工厂

1、介绍

2、主要角色

3、代码演示

4、使用场景

二、抽象工厂

1、介绍

2、主要角色

3、代码演示

4、使用场景


一、简单工厂

1、介绍

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂 方法使一个类的实例化延迟到其子类

2、主要角色

  • 抽象产品(Product):是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口
  • 具体产品(ConcreteProduct):是简单工厂模式的创建目标
  • 简单工厂(SimpleFactory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。

3、代码演示

//产品总接口
public interface Product {
	void sale();
}

//具体产品A、B、C
public class ProductA implements Product {
	@Override
	public void sale() {
		System.out.println("出售产品A");
	}
}

public class ProductB implements Product {
	@Override
	public void sale() {
		System.out.println("出售产品B");
	}
}

public class ProductC implements Product {
	@Override
	public void sale() {
		System.out.println("出售产品C");
	}
}

//简单工厂类
public class SimpleFactory {
	public Product procedure(String type) {
		if("ProductA".equals(type)) {
			return new ProductA();
		}else if("ProductB".equals(type)){
			return new ProductB();
		}else {
			return new ProductC();
		}
	}
}

4、使用场景

jdbc连接数据库,硬件访问,降低对象的产生和销毁

使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品

二、抽象工厂

1、介绍

抽象工厂是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象

2、主要角色

主要角色如下。

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
  • 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
  • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。

3、代码演示

//1、抽象工厂,提供创建各类型产品的抽象方法
public interface AbstractFactory {
	public FruitProduct creatFruit(String fruitType);
	public MeatProduct creatMeat(String meatType);
}

//2、具体工厂(水果类&肉类),实现生产对应类型产品的方法,其余的方法return null即可
public class FruitFactory implements AbstractFactory {
	@Override
	public FruitProduct creatFruit(String fruitType) {
		if ("Apple".equals(fruitType)) {
			return new Apple();
		} else {

			return new Orange();
		}
	}

	@Override
	public MeatProduct creatMeat(String meatType) {
		// 水果类工厂不用详细实现生产肉类产品的方法
		return null;
	}
}

public class MeatFactory implements AbstractFactory {
	@Override
	public FruitProduct creatFruit(String fruitType) {
		// 肉类工厂不用具体实现生产水果类产品的方法
		return null;
	}

	@Override
	public MeatProduct creatMeat(String meatType) {
		if ("Pig".equals(meatType)) {
			return new Pig();
		} else {
			return new Chicken();
		}
	}
}

//3、抽象产品(水果类&肉类)
public interface FruitProduct {
	public void sale();
}

public interface MeatProduct {
	public void sale();
}

//4、具体产品(水果类:苹果&橙子)(肉类:鸡肉&猪肉)
public class Apple implements FruitProduct {
	@Override
	public void sale() {
		System.out.println("水果类工厂出售苹果");
	}
}
public class Orange implements FruitProduct {
	@Override
	public void sale() {
		System.out.println("水果类工厂出售橙子");
	}
}
public class Chicken implements MeatProduct{
	@Override
	public void sale() {
		System.out.println("肉类工厂出售鸡肉");
	}
}
public class Pig implements MeatProduct {
	@Override
	public void sale() {
		System.out.println("肉类工厂出售猪肉");
	}
}

4、使用场景

  • 客户端(应用层)不依赖与产品类示例如何被创建、实现等细节
  • 强调一系列相关的产品对象(数据同一产品族)一起使用创建对象需要大量的重复代码
  • 提供一个产品类的库,所有的产品以同样的接口出现,使得客户端不依赖于具体实现
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值