前言
工厂模式(Factory Pattern)是一种非常常用的创建型设计模式,提供了创建对象的最佳方式。在创建对象时,不会对客户端暴露对象的创建逻辑,而是通过使用共同的接口来创建对象。
简单记录一下,方便自己查阅。
正文
工厂模式一般分为3类:
demo抄于参考文1,懒得单独写了
以创建不同平台、不同类型游戏的场景为例
手游:射击类游戏、魔法类游戏
端游:射击类游戏、魔法类游戏
简单工厂模式
定义:定义一个工厂类,根据传入的参数不同返回不同的实例,被创建的实例具有共同的父类或接口。
适用场景
需要创建的对象较少。
客户端不关心对象的创建过程。
demo
手游游戏接口定义,并创建两个类型的手游:射击游戏、魔法游戏
// 手游游戏接口定义
public interface MobileGame {
void run();
}
// 射击游戏类创建
public class SheJiGame implements MobileGame{
public void run() {
System.out.println("启动射击游戏");
}
}
// 魔法游戏类创建
public class MoFaGame implements MobileGame{
public void run() {
System.out.println("启动魔法游戏");
}
}
手游工厂类创建
public class MobileGameFactory {
public static MobileGame createGame(String type){
if(type.equals("SheJi")){
return new SheJiGame();
}else if(type.equals("MoFa")){
return new MoFaGame();
}else{
return null;
}
}
}
调用方式
// 创建射击类游戏并启动
MobileGame sheJiGame = MobileGameFactory.createGame("SheJi");
sheJiGame.run();
// 创建魔法类游戏并启动
MobileGame moFaGame = MobileGameFactory.createGame("MoFa");
moFaGame.run();
从上面可以看出,调用的地方不需要知道对象创建过程,只需传入对应type即可。
优缺点
优点:简单易懂,根据传入的参数决定创建哪种具体的产品。
缺点:不符合开闭原则(对扩展开放,对修改关闭),因为当添加新的产品类型时,需要修改工厂类的创建方法。
工厂方法模式
定义:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。
适用场景
客户端不需要知道它所创建的对象的类。
客户端可以通过子类来指定创建对应的对象。
demo
手游游戏接口定义,并创建两个类型的手游:射击游戏、魔法游戏
// 手游游戏接口定义
public interface MobileGame {
void run();
}
// 射击游戏类创建
public class SheJiGame implements MobileGame{
public void run() {
System.out.println("启动射击游戏");
}
}
// 魔法游戏类创建
public class MoFaGame implements MobileGame{
public void run() {
System.out.println("启动魔法游戏");
}
}
手游工厂接口定义,并创建两个不同类型的手游工厂类:射击类游戏工厂、魔法类游戏工厂
// 手游工厂接口定义
public interface MobileGameFactory {
// 创建游戏
MobileGame createGame();
}
// 射击类游戏工厂类
public class SheJiGameFactory implements MobileGameFactory{
public MobileGame createGame() {
return new SheJiGame();
}
}
// 魔法类游戏工厂类
public class MoFaGameFactory implements MobileGameFactory{
public MobileGame createGame() {
return new MoFaGame();
}
}
使用方法
// 创建射击游戏并启动
MobileGame sheJiGame = new SheJiGameFactory().createGame();
sheJiGame.run();
// 创建魔法游戏并启动
MobileGame moFaGame = new MoFaGameFactory().createGame();
moFaGame.run();
优缺点
优点:符合开闭原则,当需要添加新的产品时,只需要添加新的具体产品类和工厂类。
缺点:当产品种类过多时,会有大量的工厂类存在,比较臃肿。
抽象工厂模式
定义:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
抽象工厂模式是工厂方法的进一步深化,在这个模式中的工厂类不单单可以创建一个对象,而是可以创建一组对象。
抽象工厂模式的主要角色:
抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。
demo
手游游戏接口定义,并创建两个类型的手游:射击游戏、魔法游戏
端游游戏接口定义,并创建两个类型的端游:射击游戏、魔法游戏
// 手游游戏接口定义
public interface MobileGame {
void run();
}
// 射击手游类创建
public class SheJiMobileGame implements MobileGame{
public void run() {
System.out.println("启动射击手游游戏");
}
}
// 魔法手游类创建
public class MoFaMobileGame implements MobileGame{
public void run() {
System.out.println("启动魔法手游游戏");
}
}
// PC端游戏接口定义
public interface PCGame {
void run();
}
// 射击端游类创建
public class SheJiPCGame implements PCGame{
public void run() {
System.out.println("启动射击端游游戏");
}
}
// 魔法端游类创建
public class MoFaPCGame implements PCGame{
public void run() {
System.out.println("启动魔法端游游戏");
}
}
// 抽象游戏工厂接口定义
public interface GameFactory {
// 创建手游
MobileGame createMobileGame();
// 创建端游
PCGame createPCGame();
}
// 射击类游戏工厂
public class SheJiGameFactory implements GameFactory {
// 创建射击手游类游戏
public MobileGame createMobileGame(){
return new SheJiMobileGame();
}
// 创建射击端游类游戏
public PCGame createPCGame(){
return new SheJiPCGame();
}
}
// 魔法类游戏工厂
public class MoFaGameFactory implements GameFactory {
// 创建魔法手游类游戏
public MobileGame createMobileGame(){
return new MoFaMobileGame();
}
// 创建魔法端游类游戏
public PCGame createPCGame(){
return new MoFaPCGame();
}
}
使用
// 创建射击类游戏工厂
Factory sheJiGameFactory = new SheJiGameFactory();
// 创建射击手游类游戏并启动
MobileGame sheJiMobileGame = sheJiGameFactory.createMobileGame();
sheJiMobileGame.run();
// 创建射击端游类游戏并启动
PCGame sheJiPCGame = sheJiGameFactory.createPCGame();
sheJiPCGame.run();
// 创建魔法类游戏工厂
Factory moFaGameFactory = new MoFaGameFactory();
// 创建魔法手游类游戏并启动
MobileGame moFaMobileGame = moFaGameFactory.createMobileGame();
moFaMobileGame.run();
// 创建魔法端游类游戏并启动
PCGame moFaPCGame = moFaGameFactory.createPCGame();
moFaPCGame.run();
优缺点
优点:适用于创建对象的逻辑复杂且对象之间有一定关联的场景
缺点:实现复杂,不适合简单的场景。
参考文章
《》
《》
《》
《