工厂模式
1 一般工厂模式
1.1 介绍
1.1.1 什么是策略模式
Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
1.1.2 优点
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
1.1.3 缺点
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
1.1.4 使用场景
- 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
- 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
- 设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
1.1.5 策略模式包含以下几个核心角色
抽象产品(Abstract Product):定义了产品的共同接口或抽象类。它可以是具体产品类的父类或接口,规定了产品对象的共同方法。
具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。
抽象工厂(Abstract Factory):声明了创建产品的抽象方法,可以是接口或抽象类。它可以有多个方法用于创建不同类型的产品。
具体工厂(Concrete Factory):实现了抽象工厂接口,负责实际创建具体产品的对象。
1.2 通用实现
//定义游戏接口
interface Game {
public void play();
}
//A游戏
class GameA implements Game{
public void play(){System.out.println("Playing GameA");};
}
//B游戏
class GameB implements Game{
public void play(){System.out.println("Playing GameB");};
}
//C游戏
class GameC implements Game{
public void play(){System.out.println("Playing GameC");};
}
class GameFactory {
public Game createGame(char type) {
switch (type) {
case 'A':
return new GameA();
case 'B':
return new GameB();
case 'C':
return new GameC();
}
return null;
}
}
//测试者(客户)类
class Tester {
private char type;
public Tester(char type) {
this.type = type;
}
public void testGame() {
GameFactory gameFactory = new GameFactory();
//通过简单工厂获取游戏实例
Game game = gameFactory.createGame(type);
//试玩游戏
game.play();
}
}
//代码测试
public class Test {
public static void main(String[] args) {
//要求测试者试玩游戏A
Tester tester = new Tester('A');
tester.testGame();
}
}
1.3 其他示例
1.4 JDK中工厂模式
2 抽象工厂模式
2.1 介绍
2.1.1 什么是策略模式
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2.1.2 优点
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象
12.1.3 缺点
产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
2.1.4 使用场景
- QQ 换皮肤,一整套一起换。
- 生成不同操作系统的程序。
2.1.5 策略模式包含以下几个核心角色
- 抽象工厂(Abstract Factory):声明了一组用于创建产品对象的方法,每个方法对应一- 种产品类型。抽象工厂可以是接口或抽象类。
- v具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品对象的实例。
- 抽象产品(Abstract Product):定义了一组产品对象的共同接口或抽象类,描述了产品对象的公共方法。
- 具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。
评论区