产品决定工厂,如果是很单一的产品,简单工厂就解决了。产品越复杂,工厂越复杂。
dota大家都玩过吧,恶魔巫师、剑圣两个英雄对应两个产品,我们把英雄的攻击方法抽象成一个接口,围绕这个我们讨论一下设计模式
简单工厂: 只有一个工厂;
interface Character {
public void attack();
}
class Emowusi implements Character {
@Override
public void attack() {
System.out.println("死亡一指");
}
}
class Jiansheng implements Character {
@Override
public void attack() {
System.out.println("无敌斩");
}
}
class SimpleFactory<T> {
public T create(Class<T> clazz) {
try {
return clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
main方法如下:
public static void main(String[] args) {
SimpleFactory factoryMethod = new SimpleFactory();
Character character = (Emowusi) factoryMethod.create(Emowusi.class);
character.attack();
}
死亡一指
工厂方法模式:工厂改进为一个抽象工厂,每个类对应一个工厂,横向扩展会导致工厂也跟着扩展,但不会改变内部结构;
为什么需要引进工厂方法模式?在我们生成英雄的时候,不一定每个英雄都是很简单的new,有些英雄可能会很复杂,都写在一个factory里面会导致这个类不易于维护。
abstract class AbstractFacotyMethod {
public abstract Character create();
}
class EmowusiFactoryMethod extends AbstractFacotyMethod {
@Override
public Character create() {
System.out.println("***************恶魔巫师制造中***************");
System.out.println("***************step 1***************");
System.out.println("***************step 2***************");
System.out.println("***************恶魔巫师完成***************");
return new Emowusi();
}
}
class JianshengFactoryMethod extends AbstractFacotyMethod {
@Override
public Character create() {
System.out.println("***************剑圣制造中***************");
System.out.println("***************step 1***************");
System.out.println("***************step 2***************");
System.out.println("***************step 3***************");
System.out.println("***************剑圣完成***************");
return new Jiansheng();
}
}
英雄不变化,main方法如下:
public static void main(String[] args) {
AbstractFacotyMethod emowusiFacotyMethod = new EmowusiFactoryMethod();
Character otherCharacter = emowusiFacotyMethod.create();
otherCharacter.attack();
}
***************恶魔巫师制造中***************
***************step 1***************
***************step 2***************
***************恶魔巫师完成***************
死亡一指
抽象工厂:当一类产品再细分成两类产品,工厂方法模式会增加两个工厂,而抽象工厂不会,但是内部结构会变化,在抽象工厂模式下同一个工厂对应不同的生产方法。
现在有新要求,剑圣有两种类别,红颜色恶魔巫师和蓝颜色恶魔巫师,该怎么设计呢,红色的人名币玩家,技能比较厉害!如果按照工厂模式,必然要增加工厂,思考一下!
abstract class AbstractFacoty {
public abstract RedEmowusi createByRed();
public abstract BlueEmowusi createByBlue();
}
class EmowusiFactory extends AbstractFacoty {
@Override
public RedEmowusi createByRed() {
System.out.println("***************红色恶魔巫师制造中***************");
System.out.println("***************step 1***************");
System.out.println("***************step 2***************");
System.out.println("***************红色恶魔巫师完成***************");
return new RedEmowusi();
}
@Override
public BlueEmowusi createByBlue() {
System.out.println("***************蓝色恶魔巫师制造中***************");
System.out.println("***************step 1***************");
System.out.println("***************step 2***************");
System.out.println("***************蓝色恶魔巫师完成***************");
return new BlueEmowusi();
}
}
interface RedCharacter {
public void attack();
}
interface BlueCharacter {
public void attack();
}
class RedEmowusi implements RedCharacter {
@Override
public void attack() {
System.out.println("红色恶魔巫师 释放 死亡一指");
}
}
class BlueEmowusi implements BlueCharacter {
@Override
public void attack() {
System.out.println("蓝色恶魔巫师 释放 死亡一指");
}
}
main方法如下:
public static void main(String[] args) {
AbstractFacoty redEmowusiFacoty = new EmowusiFactory();
RedCharacter character = redEmowusiFacoty.createByRed();
character.attack();
}
***************红色恶魔巫师制造中***************
***************step 1***************
***************step 2***************
***************红色恶魔巫师完成***************
红色恶魔巫师 释放 死亡一指