假如现在女蜗还需要生产男性和女性,使用抽象工厂模式,类图如下:
定义人种接口:
package com.jack.abstractfactory;
/**
* Created by jack on 2017/8/1.
* 人类接口
*/
public interface Human {
/**
* 每个人种的皮肤都有相应的颜色
*/
void getColor();
/**
* 人会说话交谈
*/
void talk();
/**
* 人是有性别的,获取人的性别
*/
void getSex();
}
人种有三个抽象类,负责人种的抽象属性定义:肤色和语言。白色,黑色,黄色人种,代码如下:
package com.jack.abstractfactory;
/**
* Created by jack on 2017/8/1.
* 黑色人种抽象类
*/
public abstract class AbstractBlackHuman implements Human{
@Override
public void getColor() {
System.out.println("黑色人种的皮肤是黑色的");
}
@Override
public void talk() {
System.out.println("黑色人种说黑话");
}
}
package com.jack.abstractfactory;
/**
* Created by jack on 2017/8/1.
* 白色人种抽象类
*/
public abstract class AbstractWhiteHuman implements Human{
@Override
public void getColor() {
System.out.println("白色人种的皮肤是白色的");
}
@Override
public void talk() {
System.out.println("白色人种一般说英语");
}
}
package com.jack.abstractfactory;
/**
* Created by jack on 2017/8/1.
* 黄色人种抽象类
*/
public abstract class AbstractYellowHuman implements Human{
@Override
public void getColor() {
System.out.println("黄色人种的皮肤是黄色的");
}
@Override
public void talk() {
System.out.println("黄色人种都说普通话");
}
}
每个抽象类都有两个实现类,分别实现公共的最细节,最具体的事务:肤色和语言。具体的实现类实现肤色,性别定义,以黄色女性人种为例,代码如下:
package com.jack.abstractfactory;
/**
* Created by jack on 2017/8/1.
* 黄人女性
*/
public class FemaleYellowHuman extends AbstractYellowHuman{
@Override
public void getSex() {
System.out.println("黄人女性");
}
}
package com.jack.abstractfactory;
/**
* Created by jack on 2017/8/1.
* 黄人男性
*/
public class MaleYellowHuman extends AbstractYellowHuman{
@Override
public void getSex() {
System.out.println("黄人男性");
}
}
其他的黑色人种,白色人种和上面的男性和女性的代码类似,不在贴代码,具体的参考:https://github.com/wj903829182/springboot/tree/master/designpattern
到这里,就已经把真实的人种都定义出来了,下面看看怎么进行制造。
定义造人的接口:
package com.jack.abstractfactory;
/**
* Created by jack on 2017/8/1.
* 人类生产接口类
*/
public interface HumanFactory {
//制造黄色人种
Human createYellowHuman();
//制造黑色人种
Human createBlackHuman();
//制造白色人种
Human createWhiteHuman();
}
女性生产人实现类:
package com.jack.abstractfactory;
/**
* Created by jack on 2017/8/1.
* 女性工厂类
*/
public class FemaleFactory implements HumanFactory{
/**
* 生产出黄人女性
* @return
*/
@Override
public Human createYellowHuman() {
return new FemaleYellowHuman();
}
/**
* 生产出黑人女性
* @return
*/
@Override
public Human createBlackHuman() {
return new FemaleBlackHuman();
}
/**
* 生产出白人女性
* @return
*/
@Override
public Human createWhiteHuman() {
return new FemaleWhiteHuman();
}
}
男性生产实现类:
package com.jack.abstractfactory;
/**
* Created by jack on 2017/8/1.
* 男性生产类
*/
public class MaleFactory implements HumanFactory{
/**
* 生产出黄人男性
* @return
*/
@Override
public Human createYellowHuman() {
return new MaleYellowHuman();
}
/**
* 生产出黑人男性
* @return
*/
@Override
public Human createBlackHuman() {
return new MaleBlackHuman();
}
/**
* 生产出白人男性
* @return
*/
@Override
public Human createWhiteHuman() {
return new MaleWhiteHuman();
}
}
设施已经齐全了,下面看看女娲怎么造人,测试代码如下:
package com.jack.abstractfactory;
/**
* Created by jack on 2017/8/1.
*/
public class NvWaB {
public static void main(String[] args) {
//第一条生产线,男性生产线
HumanFactory maleHumanFactory = new MaleFactory();
//第二条生产线,女性生产线
HumanFactory femaleHumanFactory = new FemaleFactory();
//生产线建立完成,开始进行生产
Human maleYellowHuman = maleHumanFactory.createYellowHuman();
Human femaleYellowHuman = femaleHumanFactory.createYellowHuman();
System.out.println("生产一个黄色女性 : ");
femaleYellowHuman.getSex();
femaleYellowHuman.getColor();
femaleYellowHuman.talk();
System.out.println("\n生产一个黄色男性 : ");
maleYellowHuman.getSex();
maleYellowHuman.getColor();
maleYellowHuman.talk();
}
}
运行程序,输出如下:
生产一个黄色女性 :
黄人女性
黄色人种的皮肤是黄色的
黄色人种都说普通话
生产一个黄色男性 :
黄人男性
黄色人种的皮肤是黄色的
黄色人种都说普通话
抽象工厂模式的优点:
1,封装性,每个产品的实现类不是高层模块关心的,关心的是接口,是抽象。
2,产品族类的约束为非公开状态。
缺点:
1,产品族扩展非常困难