1.简单工厂模式
不属于23种设计模式之一。简单工厂模式又叫静态工厂方法模式,是工厂方法模式特殊实现。
简单工厂模式的角色包括三个:1)抽象产品角色;2)具体产品角色;3)工厂类角色
//抽象产品类
public abstract class Weapon {
//武器攻击行为
public abstract void attack();
}
//具体产品角色
public class Tank extends Weapon{
@Override
public void attack() {
System.out.println("坦克攻击!");
}
}
public class Fighter extends Weapon{
@Override
public void attack() {
System.out.println("飞机攻击!");
}
}
//工厂类角色
public class WeaponFactory {
//根据武器类型生产武器
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 {
throw new RuntimeException("不支持该武器!");
}
return weapon;
}
}
简单工厂模式的优点:
客户端程序不需要关心对象的创建细节,需要哪个对象时,只需要调用工厂类,初步实现了责任的分离。客户端只负责“消费”,工厂负责“生产”。生产和消费分离。
简单工厂模式的缺点:
工厂类集中了所有产品的创造逻辑,一旦出问题,整个系统瘫痪;不符合OCP开闭原则,在进行系统扩展时,需要修改工厂类。
2.工厂方法模式
23种设计模式之一。
工厂方法模式的角色包括:1)抽象产品角色;2)具体产品角色;3)抽象工厂角色;4)具体工厂角色
//抽象产品类
public abstract class Weapon {
//武器攻击行为
public abstract void attack();
}
//具体产品角色
public class Tank extends Weapon{
@Override
public void attack() {
System.out.println("坦克攻击!");
}
}
public class Fighter extends Weapon{
@Override
public void attack() {
System.out.println("飞机攻击!");
}
}
//抽象工厂角色
public interface WeaponFactory {
Weapon get();
}
//具体工厂角色
public class TankFactory implements WeaponFactory{
@Override
public Weapon get() {
return new Tank();
}
}
public class FighterFactory implements WeaponFactory{
@Override
public Weapon get() {
return new Fighter();
}
}
工厂方法模式的优点:
符合OCP原则,想扩展一个新的产品,只要新增一个产品类,再新增一个该产品对应的工厂即可;屏蔽产品的具体实现,调用者只关心产品的接口。
工厂方法模式的缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
3.抽象工厂模式
23种设计模式之一。
工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。
抽象工厂模式的角色包括:1)抽象产品角色;2)具体产品角色;3)抽象工厂角色;4)具体工厂角色
//抽象工厂类
public abstract class AbstractFactory {
public abstract Weapon getWeapon(String type);
public abstract Fruit getFruit(String type);
}
//具体工厂类
public class WeaponFactory extends AbstractFactory{
public Weapon getWeapon(String type){
if (type == null || type.trim().length() == 0) {
return null;
}
if ("Gun".equals(type)) {
return new Gun();
} else if ("Dagger".equals(type)) {
return new Dagger();
} else {
throw new RuntimeException("无法生产该武器");
}
}
@Override
public Fruit getFruit(String type) {
return null;
}
}
抽象工厂模式的优缺点:
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在AbstractFactory里加代码,又要在具体的里面加代码。