系统开发和现实生活是一样的。在现实生活中一个复杂的商品都是通过一个工厂产生,具体工厂怎么产生的我们不需在乎。在软件设计上也可如此,如果一个对象的创建过程比较复杂,便可考虑使用工厂模式。
简单工厂模式
简单工厂模式的定义: 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。
按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。
我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”
简单来说,简单工厂模式有一个具体的工厂类,可以生成多个不同的产品,属于创建型设计模式。简单工厂模式不在 GoF 23 种设计模式之列。
简单工厂模式每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度,违背了“开闭原则”。
“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。
过于简单,以及不实用所以不作举例说明。
工厂方法模式
因简单工厂模式违背了开闭原则,工厂方法模式是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足了开闭原则
模式的结构与实现
工厂方法模式由抽象工厂、具体工厂、抽象产品、具体产品等四个要素构成
模式的结构
工厂方法模式的主要角色如下:
- 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
- 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
示例场景:客户要根据自行车的品牌名获得一辆自行车。
- 一个抽象工厂:自行车工厂,生产自行车的工厂都实现此抽象工厂,这样就满足了开闭原则
- 有两个具体工厂:捷安特工厂、喜德盛工厂。
- 一种产品:自行车
- 两个具体产品:捷安特自行车、喜德盛自行车。
package com.wly.DesignPatterns;
public class AbstractFactoryTest {
public static void main(String[] args) {
//抽象商品
Bike bike;
//抽象工厂
BikeFactory bikeFactory;
try {
System.out.println("需求一:");
System.out.println("我要一辆捷安特自行车");
//使用品牌名创建工厂
String brand = "GiantFactory";
//获得具体工厂
Class<?> c = Class.forName("com.wly.DesignPatterns."+brand);
bikeFactory = (BikeFactory)c.newInstance();
//创建自行车
bike = bikeFactory.newBike();
bike.show();
}catch (Exception e){
System.out.println("没有此品牌自行车工厂");
}
try {
System.out.println("需求二:");
System.out.println("我要一辆喜德盛自行车");
//使用品牌名创建工厂
String brand = "XdsFactory";
//获得具体工厂
Class<?> c = Class.forName("com.wly.DesignPatterns."+brand);
bikeFactory = (BikeFactory)c.newInstance();
//创建自行车
bike = bikeFactory.newBike();
bike.show();
}catch (Exception e){
System.out.println("没有此品牌自行车工厂");
}
}
}
/**抽象工厂:提供产品的生成方法*/
interface BikeFactory{
/**生成产品*/
Bike newBike();
}
/**具体工厂1:生成具体的产品*/
class GiantFactory implements BikeFactory{
@Override
public Bike newBike() {
return new GiantBike();
}
}
/**具体工厂2:生成具体的产品*/
class XdsFactory implements BikeFactory{
@Override
public Bike newBike() {
return new XdsBike();
}
}
/**抽象产品*/
interface Bike{
/**产品接口*/
void show();
}
/**具体产品1*/
class GiantBike implements Bike{
@Override
public void show() {
System.out.println("捷安特自行车");
}
}
/**具体产品2*/
class XdsBike implements Bike{
@Override
public void show() {
System.out.println("喜德盛自行车");
}
}
输出:
需求一: 我要一辆捷安特自行车 捷安特自行车 需求二: 我要一辆喜德盛自行车 喜德盛自行车
抽象工厂模式
前面说了工厂模式,可是一个工厂的产品往往不止一种。例如:腾讯公司不仅仅产方便我们沟通联系的聊天软件产品,还产供我们休闲娱乐的游戏产品。比亚迪不仅仅生产汽车,在今年疫情还生产起了口造等等例子。
抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
优点:抽象工厂模式就是在工厂模式的基础上,增加了工厂生产产品的种类。这样抽象工厂模式可以生产多种产品。多个产品可以在同一个类中共同管理
模式的结构与实现
结构与工厂模式相同,实现上抽象方法的个数不同。因为与工厂模式相差甚小,所以不做示例实现。