# 原创作品,转载请注明出处,谢谢!@杨福星
(http://blog.csdn.net/luckystar92/article/details/52176737)
*前言:
最近在学习抽象工厂设计模式,网上也查询了不少资料,本文是自己学习中的一点理解,以便后期回顾!好记性不如烂笔头!…^_ ^
概念:
抽象工程设计模式——“
是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。 ”(摘自百度百科)
设计模式学习网站【推荐】
[http://www.runoob.com/design-pattern/abstract-factory-pattern.html]
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
*注:个人理解:
一、实例:水果和蔬菜
*需求:生产北方水果、南方水果、北方蔬菜、南方蔬菜
二、实例:CPU和显卡
*需求:电脑必备:CPU和显卡;CPU和显卡又分为Intel产的CPU、显卡,AMD产的CPU、显卡。
三、实例:法师和战士
*需求:
英雄联盟一战队组建,需要考虑到物攻与法攻都有!可以是男法师、男战士;女法师、女战士;当然也可混合。
故应用抽象工厂模式:创造战士与法师
1、UML关系图:
2、编程实现
*英雄类:
英雄:Hero.java
public interface Hero {
void fight();
}
法师:MagicHero .java
public interface MagicHero extends Hero{
void fight();
}
战士:PhysicalHero .java
public interface PhysicalHero extends Hero{
void fight();
}
*法师(男、女):
FemaleMagicHero .java
public class FemaleMagicHero implements MagicHero{
private String name;
@Override
public void fight(){
System.out.println("\t"+this.name+"施展法术:魅惑绝技!");
}
public FemaleMagicHero(String name) {
super();
this.name = name;
}
/**
*@return the name
*/
public String getName() {
return name;
}
/**
*@param name the name to set
*/
public void setName(String name) {
this.name = name;
}
}
MaleMagicHero .java
public class MaleMagicHero implements MagicHero{
private String name;
@Override
public void fight(){
System.out.println("\t"+this.name+"施展法术:死而复生!");
}
/**
*@return the name
*/
public String getName() {
return name;
}
/**
*@param name the name to set
*/
public void setName(String name) {
this.name = name;
}
public MaleMagicHero(String name) {
super();
this.name = name;
}
}
*战士(男、女):
FemalePhysicalHero .java
public class FemalePhysicalHero implements PhysicalHero{
private String name;
public FemalePhysicalHero(String name) {
super();
this.name = name;
}
/**
*@return the name
*/
public String getName() {
return name;
}
/**
*@param name the name to set
*/
public void setName(String name) {
this.name = name;
}
@Override
public void fight(){
System.out.println("\t"+this.name+"施展物理攻击:巾帼之力!");
}
}
MalePhysicalHero .java
public class MalePhysicalHero implements PhysicalHero{
private String name;
public MalePhysicalHero(String name) {
super();
this.name = name;
}
/**
*@return the name
*/
public String getName() {
return name;
}
/**
*@param name the name to set
*/
public void setName(String name) {
this.name = name;
}
@Override
public void fight(){
System.out.println("\t"+this.name+"施展物理攻击:雷霆暴击!");
}
}
*工厂类:
(分为生产男英雄工厂与生产女英雄工厂,毕竟男女不一样吗!哈哈^_^)
public interface HeroFactory {
public MagicHero createMagicHero(String name);
public PhysicalHero createPhysicalHero(String name);
}
生产女英雄工厂(包含法师和战士): FemaleHeroFactory .java
public class FemaleHeroFactory implements HeroFactory {
@Override
public MagicHero createMagicHero(String name) {
// TODO Auto-generated method stub
System.out.println("女法师:"+(new FemaleMagicHero(name)).getName()+"***诞生了!");
return new FemaleMagicHero(name);
}
@Override
public PhysicalHero createPhysicalHero(String name) {
// TODO Auto-generated method stub
System.out.println("女战士:"+(new FemalePhysicalHero(name)).getName()+"***诞生了!");
return new FemalePhysicalHero(name);
}
}
生产男英雄工厂(包含法师和战士):MaleHeroFactory .java
public class MaleHeroFactory implements HeroFactory {
@Override
public MagicHero createMagicHero(String name) {
// TODO Auto-generated method stub
System.out.println("男法师:"+(new MaleMagicHero(name)).getName()+"***诞生了!");
return new MaleMagicHero(name);
}
@Override
public PhysicalHero createPhysicalHero(String name) {
// TODO Auto-generated method stub
System.out.println("男战士:"+(new MalePhysicalHero(name)).getName()+"***诞生了!");
return new MalePhysicalHero(name);
}
}
工厂产生器: FactoryProducer .java
public class FactoryProducer {
public static HeroFactory getFactory(String choiceFactory) {
if (choiceFactory.equalsIgnoreCase("male")) {
return new MaleHeroFactory();
} else if (choiceFactory.equalsIgnoreCase("female")) {
return new FemaleHeroFactory();
}
return null;
}
}
Main .java
public class Main {
public static void main(String[] args) {
HeroFactory hff = FactoryProducer.getFactory("female");
HeroFactory hfm = FactoryProducer.getFactory("male");
Hero[] mha = { hff.createMagicHero("琴女"), hfm.createMagicHero("流浪"), hff.createPhysicalHero("寒冰射手"),
hfm.createPhysicalHero("盲僧"), hff.createMagicHero("九尾妖狐") };
for (Hero j : mha) {
j.fight();
}
}
}
输出:
*欢迎交流学习!博主知识浅薄,希望有不对的地方能得到您的指正!谢谢!^_^