①增加产品族,是符合开闭原则的
②增加产品等级结构,需要修改每个产品族的代码,不符合开闭原则
package Abstract_Factory;
public interface Creator {
public ProductA factoryA();
public ProductB factoryB();
}
package Abstract_Factory;
public class Creator1 implements Creator{ // 产品族 1
public ProductA factoryA() {
return new ProductA1();
}
public ProductB factoryB() {
return new ProductB1();
}
}
package Abstract_Factory;
public class Creator2 implements Creator{ // 产品族 2
public ProductA factoryA() {
return new ProductA2();
}
public ProductB factoryB() {
return new ProductB2();
}
}
package Abstract_Factory;
public interface ProductA { // 产品等级结构 A
public void show();
}
package Abstract_Factory;
public class ProductA1 implements ProductA{
public void show() {
System.out.println("这是A1");
}
}
package Abstract_Factory;
public class ProductA2 implements ProductA{
public void show() {
System.out.println("这是A2");
}
}
package Abstract_Factory;
public interface ProductB { // 产品等级结构 B
public void show();
}
package Abstract_Factory;
public class ProductB1 implements ProductB{
public void show() {
System.out.println("这是B1");
}
}
package Abstract_Factory;
public class ProductB2 implements ProductB{
public void show() {
System.out.println("这是B2");
}
}
package Abstract_Factory;
public class Client {
public static void main(String[] args) {
Creator c1 = new Creator1(); // 产品族 1 的工厂
ProductA pa1 = c1.factoryA(); // 生产 A1
ProductB pb1 = c1.factoryB(); // 生产 B1
pa1.show();
pb1.show();
System.out.println();
Creator c2 = new Creator2(); // 产品族 2 的工厂
ProductA pa2 = c2.factoryA(); // 生产 A2
ProductB pb2 = c2.factoryB(); // 生产 B2
pa2.show();
pb2.show();
}
}
例题
package Homework_Abstract_Factory;
public abstract class EnemyFactory { // 工厂
public abstract Fighter getFighter(); // 抽象类中只定义函数而不实现只能是抽象函数
public abstract Monster getMonster(); // 需要加上 abstract 前缀
public static EnemyFactory getAFactory(String choice) {
EnemyFactory ef = null;
if(choice.equals("初级")) ef = new SlowEnemyFactory();
else if(choice.equals("中级")) ef = new MedEnemyFactory();
else ef = new SupEnemyFactory();
return ef;
}
}
package Homework_Abstract_Factory;
public class SlowEnemyFactory extends EnemyFactory{ // 初级工厂
public Fighter getFighter() {
return new SlowFighter();
}
public Monster getMonster() {
return new SlowMonster();
}
}
package Homework_Abstract_Factory;
public class MedEnemyFactory extends EnemyFactory{ // 中级工厂
public Fighter getFighter() {
return new MedFighter();
}
public Monster getMonster() {
return new MedMonster();
}
}
package Homework_Abstract_Factory;
public class SupEnemyFactory extends EnemyFactory{ // 高级工厂
public Fighter getFighter() {
return new SupFighter();
}
public Monster getMonster() {
return new SupMonster();
}
}
package Homework_Abstract_Factory;
public interface Fighter { // 士兵接口
public void getSpeed();
public void getWeapon();
}
package Homework_Abstract_Factory;
public class SlowFighter implements Fighter{ // 初级士兵
int SlowSpeed = 10;
String SlowWeapon = "初级武器";
public void getSpeed() {
System.out.println("初级士兵的移速:" + SlowSpeed);
}
public void getWeapon() {
System.out.println("初级士兵的武器:" + SlowWeapon);
}
}
package Homework_Abstract_Factory;
public class MedFighter implements Fighter{ // 中级士兵
int MedSpeed = 100;
String MedWeapon = "中级武器";
public void getSpeed() {
System.out.println("中级士兵的移速:" + MedSpeed);
}
public void getWeapon() {
System.out.println("中级士兵的武器:" + MedWeapon);
}
}
package Homework_Abstract_Factory;
public class SupFighter implements Fighter{ // 高级士兵
int SupSpeed = 1000;
String SupWeapon = "高级武器";
public void getSpeed() {
System.out.println("高级士兵的移速:" + SupSpeed);
}
public void getWeapon() {
System.out.println("高级士兵的武器:" + SupWeapon);
}
}
package Homework_Abstract_Factory;
public interface Monster { // 怪兽接口
public void getVitality();
public void getIntelligence();
}
package Homework_Abstract_Factory;
public class SlowMonster implements Monster{ // 初级怪兽
int SlowVitality = 10;
String SlowIntelligence = "反应迟钝";
public void getVitality() {
System.out.println("初级怪兽的生命值:" + SlowVitality);
}
public void getIntelligence() {
System.out.println("初级怪兽的智力情况:" + SlowIntelligence);
}
}
package Homework_Abstract_Factory;
public class MedMonster implements Monster{ // 中级怪兽
int MedVitality = 100;
String MedIntelligence = "反应适度";
public void getVitality() {
System.out.println("中级怪兽的生命值:" + MedVitality);
}
public void getIntelligence() {
System.out.println("中级怪兽的智力情况:" + MedIntelligence);
}
}
package Homework_Abstract_Factory;
public class SupMonster implements Monster{ // 高级怪兽
int SupVitality = 1000;
String SupIntelligence = "反应敏捷";
public void getVitality() {
System.out.println("高级怪兽的生命值:" + SupVitality);
}
public void getIntelligence() {
System.out.println("高级怪兽的智力情况:" + SupIntelligence);
}
}
package Homework_Abstract_Factory;
import java.util.Scanner;
public class Client {
public static void main(String[] args) { // 主函数
Scanner reader = new Scanner(System.in);
String s = "";
while(!s.equals("0")) {
System.out.println("请输入选择难度:1 为初级,2 为中级,3 为高级. 0 为退出 :");
s = reader.nextLine();
EnemyFactory ef = null;
if(s.equals("0")) {
System.out.println("退出成功!");
break;
}
else if(s.equals("1")) ef = EnemyFactory.getAFactory("初级");
else if(s.equals("2")) ef = EnemyFactory.getAFactory("中级");
else ef = EnemyFactory.getAFactory("高级");
Fighter f = ef.getFighter();
Monster m = ef.getMonster();
f.getSpeed();
f.getWeapon();
m.getVitality();
m.getIntelligence();
System.out.println();
}
}
}