GoF之工厂模式
GoF是指二十三种设计模式
GoF23种设计模式可分为三大类:
-
创建型(5个):解决对象创建问题。
-
-
-
单例模式
-
工厂方法模式
-
抽象工厂模式
-
建造者模式
-
原型模式
-
-
-
结构型(7个):一些类或对象组合在一起的经典结构。
-
-
-
代理模式
-
装饰模式
-
适配器模式
-
组合模式
-
享元模式
-
外观模式
-
桥接模式
-
-
-
行为型(11个):解决类或对象之间的交互问题。
-
-
-
策略模式
-
模板方法模式
-
责任链模式
-
观察者模式
-
迭代子模式
-
命令模式
-
备忘录模式
-
状态模式
-
访问者模式
-
中介者模式
-
解释器模式
-
-
工厂模式是解决对象创建问题的,所以工厂模式属于创建型设计模式。这里为什么学习工厂模式呢?这是因为Spring框架底层使用了大量的工厂模式。
1.1工厂模式的三种形态
工厂模式通常有三种形态:
-
第一种:简单工厂模式(Simple Factory):不属于23种设计模式之一。简单工厂模式又叫做静态工厂模式。简单工厂模式是工厂模式的一种特殊实现。
-
工厂方法模式(Factory Method):是二十三种设计模式之一。
-
抽象工厂模式(Abstract Factory):是二十三种设计模式之一。
1.2 简单工厂模式
简单工厂模式的角色包括三个:
-
抽象产品:角色
-
具体产品:角色
-
工厂类:角色
代码如下:
抽象产品角色:
package com.powernode.factory;
?
/**
* 武器(抽象产品角色)
* @author 耀耀
* @version 1.0
* @className Weapon
* @since 1.0
**/
public abstract class Weapon {
/**
* 所有的武器都有攻击行为
*/
public abstract void attack();
}
具体产品角色:
package com.powernode.factory;
?
/**
* 坦克(具体产品角色)
* @author 耀耀
* @version 1.0
* @className Tank
* @since 1.0
**/
public class Tank extends Weapon{
@Override
public void attack() {
System.out.println("坦克开炮!");
}
}
?
package com.powernode.factory;
?
/**
* 战斗机(具体产品角色)
* @author 耀耀
* @version 1.0
* @className Fighter
* @since 1.0
**/
public class Fighter extends Weapon{
@Override
public void attack() {
System.out.println("战斗机投下原子弹!");
}
}
?
package com.powernode.factory;
?
/**
* 匕首(具体产品角色)
* @author 耀耀
* @version 1.0
* @className Dagger
* @since 1.0
**/
public class Dagger extends Weapon{
@Override
public void attack() {
System.out.println("砍他丫的!");
}
}
?
工厂类角色:
package com.powernode.factory;
?
/**
* 工厂类角色
* @author 耀耀
* @version 1.0
* @className WeaponFactory
* @since 1.0
**/
public class WeaponFactory {
/**
* 根据不同的武器类型生产武器
* @param weaponType 武器类型
* @return 武器对象
*/
public static Weapon get(String weaponType){
if (weaponType == null || weaponType.trim().length() == 0) {
return null;
}
Weapon weapon = null;
if ("TANK".equals(weaponType)) {
weapon = new Tank();
} else if ("FIGHTER".equals(weaponType)) {
weapon = new Fighter();
} else if ("DAGGER".equals(weaponType)) {
weapon = new Dagger();
} else {
throw new RuntimeException("不支持该武器!");
}
return weapon;
}
}
?
测试程序(客户端程序):
package com.powernode.factory;
?
/**
* @author 耀耀1
* @version 1.0
* @className Client
* @since 1.0
**/
public class Client {
public static void main(String[] args) {
Weapon weapon1 = WeaponFactory.get("TANK");
weapon1.attack();
?
Weapon weapon2 = WeaponFactory.get(&q