目录
一、简单工厂
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、使用场景
- 客户端(应用层)不依赖与产品类示例如何被创建、实现等细节
- 强调一系列相关的产品对象(数据同一产品族)一起使用创建对象需要大量的重复代码
- 提供一个产品类的库,所有的产品以同样的接口出现,使得客户端不依赖于具体实现