工厂模式
简单工厂模式⌗
感觉我之前学的有点老了,最新的可以去参考Factory
简单工厂模式,属于创建型模式,不属于GOF23种设计模式之一。
主要适用于生成对象较少的场景,不需要关心类的创建逻辑。
缺点是违背了开闭原则,增加新的类需要去修改工厂类的判断逻辑,不易于扩展。
示例: 这里拿糖果工厂举例
// 创建糖果接口,调用make方法去制造糖果
public interface Candy {
void make();
}
// 创建星形糖果类,实现Candy接口,重写make方法
public class StarCandy implements Candy {
@Override
public void make() {
System.out.println("制作了星形糖果");
}
}
// 创建爱心糖果类,实现Candy接口,重写make方法
public class LoveCandy implements Candy {
@Override
public void make() {
System.out.println("制作了爱心糖果");
}
}
//创建糖果工厂
public class CandyFactory {
public Candy create(Class<? extends Candy> clazz) {
try {
if (clazz != null) {
return (Candy)clazz.newInstance();
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
public class Main {
public static void main(String[] args) {
Candy candy = new CandyFactory().create(LoveCandy.class);
candy.make();
// 执行后就会打印 制作了爱心糖果
}
}
工厂方法模式⌗
为创建一个对象定义一个接口,但是让子类决定实例化哪个类。工厂方法允许类将实例化延迟到子类。
可以参考Factory Method
优点是可以不用关心类的创建细节,符合开闭原则,提高了扩展性
缺点是类的数量容易增加,增加了代码结构的复杂程度,增加了系统的抽象性和理解难度
// 创建糖果接口,调用make方法去制造糖果
public interface Candy {
void make();
}
public class StarCandy implements Candy {
@Override
public void make() {
System.out.println("制作了星形糖果");
}
}
public class LoveCandy implements Candy {
@Override
public void make() {
System.out.println("制作了爱心糖果");
}
}
public interface CandyFactory {
Candy create();
}
public class LoveCandyFactory implements CandyFactory{
@Override
public Candy create() {
return new LoveCandy();
}
}
public class StarCandyFactory implements CandyFactory{
@Override
public Candy create() {
return new StarCandy();
}
}
public class Main {
public static void main(String[] args) {
CandyFactory factory = new LoveCandyFactory();
factory.create().make();
}
}
抽象工厂⌗
创建型模式,提供一个可以创建一个系列或者互相依赖的对象的接口,不需要指定具体的类。
可以参考Abstract Factory
利用抽象工厂,我们可以直接批量创建一系列的对象,不需要关心对象的实现细节
缺点是对其进行更新时我们需要去修改对应的细节
这里我们采用java-design-patterns中类似的参考例子
首先每个王国都有国王和军队,国王和军队有各自的行为,我们先分别创建人类和恶魔的国王和军队,并分别实现自己的对应的行为
public interface King {
void order();
}
public interface Army {
void attack();
}
public class HumanKing implements King{
@Override
public void order() {
System.out.println("命令人类军队出击!");
}
}
public class HumanArmy implements Army{
@Override
public void attack() {
System.out.println("人类军队出击!");
}
}
public class DemonKing implements King{
@Override
public void order() {
System.out.println("命令魔族军队出击!");
}
}
public class DemonArmy implements Army{
@Override
public void attack() {
System.out.println("魔族军队出击!");
}
}
然后我们在创建王国工厂,用于创建一个王国
//这里采用的是接口,如果有公共逻辑,则可以使用抽象类
public interface KingdomFactory {
King createKing();
Army createArmy();
}
public class HumanKingdomFactory implements KingdomFactory{
@Override
public King createKing() {
return new HumanKing();
}
@Override
public Army createArmy() {
return new HumanArmy();
}
}
public class DemonKingdomFactory implements KingdomFactory{
@Override
public King createKing() {
return new DemonKing();
}
@Override
public Army createArmy() {
return new DemonArmy();
}
}
public class Main {
public static void main(String[] args) {
KingdomFactory humanKindom = new HumanKingdomFactory();
humanKindom.createKing().order();
humanKindom.createArmy().attack();
}
}
Read other posts