推荐学习:《java视频教程》
什么是抽象工厂模式
抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
满足条件:
系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。系统一次只可能消费其中某一族产品,即同族的产品一起使用。优点:
可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。
抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则。
缺点:
当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。抽象工厂的实现
案例的主要角色如下:抽象工厂(Abstract Factory):七侠传承工厂(SimpleFactory):师傅、师娘抽象产品(Product):天外陨石(铸剑的原材料)、一窝灵鸽蛋(未孵化的灵鸽)具体产品(ConcreteProduct):七剑。七只灵鸽
案例:师傅拥有七侠传承,会打造至阳之剑和培养雄性小灵鸽。 师娘拥有七侠传承,会打造至阴之剑和培养雌性小灵鸽。 七侠找师傅师娘打造自己的剑和领养自己的小灵鸽。
抽象产品、产品
S1接口(天外陨石):
public interface S1 { void show();}
S2接口(一窝灵鸽蛋):
public interface S2 { void show();}
A1类实现接口S1(长虹剑):
public class A1 implements S1 { @Override public void show() { System.out.println("打造了一把长虹剑"); }}
B1类实现接口S1(冰魄剑):
public class B1 implements S1 { @Override public void show() { System.out.println("打造了一把冰魄剑"); }}
C1类实现接口S1(紫云剑):
public class C1 implements S1 { @Override public void show() { System.out.println("打造了一把紫云剑"); }}
D1类实现接口S1(雨花剑):
public class D1 implements S1 { @Override public void show() { System.out.println("打造了一把紫云剑"); }}
E1类实现接口S1(青光剑):
public class E1 implements S1 { @Override public void show() { System.out.println("打造了一把紫云剑"); }}
F1类实现接口S1(奔雷剑):
public class F1 implements S1 { @Override public void show() { System.out.println("打造了一把紫云剑"); }}
G1类实现接口S1(旋风剑):
public class G1 implements S1 { @Override public void show() { System.out.println("打造了一把紫云剑"); }}
A2类实现接口S2(灵鸽一号):
public class A2 implements S2 { @Override public void show() { System.out.println("灵鸽七号"); }}
B2类实现接口S2(灵鸽二号):
public class B2 implements S2 { @Override public void show() { System.out.println("灵鸽七号"); }}
C2类实现接口S2(灵鸽三号):
public class C2 implements S2 { @Override public void show() { System.out.println("灵鸽七号"); }}
D2类实现接口S2(灵鸽四号):
public class D2 implements S2 { @Override public void show() { System.out.println("灵鸽七号"); }}
E2类实现接口S2(灵鸽五号):
public class E2 implements S2 { @Override public void show() { System.out.println("灵鸽七号"); }}
F2类实现接口S2(灵鸽六号):
public class F2 implements S2 { @Override public void show() { System.out.println("灵鸽七号"); }}
G2类实现接口S2(灵鸽七号):
public class G2 implements S2 { @Override public void show() { System.out.println("灵鸽七号"); }}
抽象工厂、工厂
Zz接口(七侠传承):
public interface Zz { S1 abc1(String a); S2 abc2(String a);}
Nan类实现接口Zz(师傅):
public class Nan implements Zz { private static S1 s1; private static S2 s2; public S1 abc1(String a) { if ("长虹剑".equals(a)) { s1 = new A1(); } else if ("奔雷剑".equals(a)) { s1 = new F1(); } else if ("青光剑".equals(a)) { s1 = new E1(); } else if ("雨花剑".equals(a)) { s1 = new D1(); } else if ("旋风剑".equals(a)) { s1 = new G1(); } else { System.out.println("铸剑失败"); } return s1; } public S2 abc2(String a) { if ("灵鸽一号".equals(a)) { s2 = new A2(); } else if ("灵鸽二号".equals(a)) { s2 = new F2(); } else if ("灵鸽三号".equals(a)) { s2 = new E2(); } else if ("灵鸽四号".equals(a)) { s2 = new D2(); } else if ("灵鸽五号".equals(a)) { s2 = new G2(); } else { System.out.println("领养失败"); } return s2; }}
Nv类实现接口Zz(师娘):
public class Nv implements Zz { private static S1 s1; private static S2 s2; public S1 abc1(String a) { if ("冰魄剑".equals(a)) { s1 = new B1(); } else if ("紫云剑".equals(a)) { s1 = new C1(); } else { System.out.println("铸剑失败"); } return s1; } public S2 abc2(String a) { if ("灵鸽六号".equals(a)) { s2 = new B2(); } else if ("灵鸽七号".equals(a)) { s2 = new C2(); } else { System.out.println("领养失败"); } return s2; }}
测试
测试类:
public class Demo { public static void main(String[] args) { System.out.println("---------至阳传承-------------"); //师傅 Nan nan = new Nan(); //造剑 S1 a1 = nan.abc1("长虹剑"); S1 d1 = nan.abc1("雨花剑"); S1 e1 = nan.abc1("青光剑"); S1 f1 = nan.abc1("奔雷剑"); S1 g1 = nan.abc1("旋风剑"); //养鸽子 S2 a2 = nan.abc2("灵鸽一号"); S2 d2 = nan.abc2("灵鸽二号"); S2 e2 = nan.abc2("灵鸽三号"); S2 f2 = nan.abc2("灵鸽四号"); S2 g2 = nan.abc2("灵鸽五号"); a1.show(); d1.show(); e1.show(); f1.show(); g1.show(); a2.show(); d2.show(); e2.show(); f2.show(); g2.show(); System.out.println("---------至阴传承-------------"); //女铸剑师 Nv nv = new Nv(); S1 b1 = nv.abc1("冰魄剑"); S1 c1 = nv.abc1("紫云剑"); b1.show(); c1.show(); S2 b2 = nv.abc2("灵鸽六号"); S2 c2 = nv.abc2("灵鸽七号"); b2.show(); c2.show(); }}
推荐学习:《java视频教程》
以上就是实例详解JAVA抽象工厂模式的详细内容,更多请关注php中文网其它相关文章!