抽象工厂模式【建造者】

抽象工厂类

Provide an interface for creating families of related or dependent objects without
specifying their concreate class.
提供一个接口来创建一系列相关的或独立的对象,而不需要指定他们的具体类。
public class AbstractFactory {

    /**
     * 抽象工厂模式:
     * Provide an interface for creating families of related or dependent objects without
     * specifying their concreate class.
     * 提供一个接口来创建一系列相关的或独立的对象,而不需要指定他们的具体类。
     */
    @Test
    public void all() {
        Composite composite = Composite.create(ElfKingdomFactory.get());
        assertEquals("ElfKing ElfCastle ElfArmy", composite.show());

        composite = Composite.create(OrcKingdomFactory.get());
        assertEquals("OrcKing OrcCastle OrcArmy", composite.show());
    }
}

interface Army {
    String desc();
}

interface Castle {
    String desc();
}

interface King {
    String desc();
}

interface KingdomFactory {
    Army createArmy();

    Castle createCastle();

    King createKing();
}

class ElfArmy implements Army {
    @Override
    public String desc() {
        return "ElfArmy";
    }
}

class ElfCastle implements Castle {
    @Override
    public String desc() {
        return "ElfCastle";
    }
}

class ElfKing implements King {
    @Override
    public String desc() {
        return "ElfKing";
    }
}

class ElfKingdomFactory implements KingdomFactory {
    private static final KingdomFactory FACTORY = new ElfKingdomFactory();

    private ElfKingdomFactory() {
    }

    public static final KingdomFactory get() {
        return FACTORY;
    }

    @Override
    public Army createArmy() {
        return new ElfArmy();
    }

    @Override
    public Castle createCastle() {
        return new ElfCastle();
    }

    @Override
    public King createKing() {
        return new ElfKing();
    }
}

@Builder
@Getter
class Composite {
    private final King king;
    private final Castle castle;
    private final Army army;

    public static final Composite create(KingdomFactory factory) {
        return Composite.builder()
                .king(factory.createKing())
                .castle(factory.createCastle())
                .army(factory.createArmy())
                .build();
    }

    public String show() {
        return String.join(" ", king.desc(), castle.desc(), army.desc());
    }
}

// 新增一个产品族
class OrcArmy implements Army {
    @Override
    public String desc() {
        return "OrcArmy";
    }
}

class OrcCastle implements Castle {
    @Override
    public String desc() {
        return "OrcCastle";
    }
}

class OrcKing implements King {
    @Override
    public String desc() {
        return "OrcKing";
    }
}

class OrcKingdomFactory implements KingdomFactory {
    private static OrcKingdomFactory FACTORY = new OrcKingdomFactory();

    private OrcKingdomFactory() {
    }

    public static final OrcKingdomFactory get() {
        return FACTORY;
    }

    @Override
    public Army createArmy() {
        return new OrcArmy();
    }

    @Override
    public Castle createCastle() {
        return new OrcCastle();
    }

    @Override
    public King createKing() {
        return new OrcKing();
    }
}

猜你喜欢

转载自www.cnblogs.com/zhuxudong/p/10163711.html