设计模式:抽象工厂模式(Abstract Factory Pattern)
2015-09-26 16:26
591 查看
抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
人种接口
人种有三个抽象类,负责人种的抽象属性定义:肤色和语言。黑色人种、白色人种、黄色人种。
每个人种抽象类会有两个实现,以性别来定义。
另外两个抽象类的实现相类似,不再赘述。
产品类说清楚了,接下来说工厂类。主要有两个工厂类,一个是男性工厂类,一个是女性工厂类。
工厂类的接口public interface HumanFactory
{
//制造一个黑人
public Human createBlackHuamn();
//制造一个白人
public Human createWhiteHuman();
//制造一个黄人
public Human createYellowHuman();
}男性工厂类的接口实现
public class MaleFactory implements HumanFactory
{
@Override
public Human createBlackHuamn()
{
return new MaleBlackHuman();
}
@Override
public Human createWhiteHuman()
{
return new MaleWhiteHuman();
}
@Override
public Human createYellowHuman()
{
return new MaleYellowHuman();
}
}
女性工厂类的接口实现
public class FemaleFactory implements HumanFactory
{
@Override
public Human createBlackHuamn()
{
return new FemaleBlackHuman();
}
@Override
public Human createWhiteHuman()
{
return new FemaleWhiteHuman();
}
@Override
public Human createYellowHuman()
{
return new FemaleYellowHuman();
}
}
针对以上两个工厂类,可以创建不同性别不同肤色的人。
以上模式就HumanFactory.java接口依赖Human.java接口,而不需要指定他们具体的实现类。
在抽象工厂模式中,AbstractBlackHuman,AbstractWhiteHuman,AbstractYellowHuman等抽象类可以定义为产品族,HumanFactory定义为抽象工厂。
需要注意:有N个产品族,在抽象工厂类中就应该有N个创建方法。
需要注意:有M个产品等级就应该有M个实现工厂类,每个实现工厂中,实现不同产品族的生产任务。
在这样的设计模式中,没有任何一个方法与实现类有关系,对于一个产品来说,我们只要知道它的工厂方法就可以直接产生一个产品对象,无须关心它的实现类。
优点:封装性,每个产品的实现类不是高层模块关心的,它关心接口和抽象类,只需要关心工厂类是谁,就能创建出一个需要的对象。
产品族的内部的约束为非公开状态。
缺点:产品族扩展困难,如果增加一个产品族,就需要在HumanFactory中增加方法,实现类同样要增加方法。
但是产品等级的扩展很简单,只需要为新的产品等级新增一个工厂类实现。
人种接口
public interface Human { //每个人种的皮肤都有相应的颜色 public abstract void getColor(); //人类会说话 public abstract void talk(); //人类有性别 public abstract void getSex(); }
人种有三个抽象类,负责人种的抽象属性定义:肤色和语言。黑色人种、白色人种、黄色人种。
//黑色人种抽象类 public abstract class AbstractBlackHuman implements Human { @Override public void getColor() { System.out.println("黑种人黑色皮肤"); } @Override public void talk() { System.out.println("黑种人说印度语"); } }
//白色人种抽象类 public abstract class AbstractWhiteHuman implements Human { @Override public void getColor(){ System.out.println("白种人白色皮肤"); } @Override public void talk(){ System.out.println("白种人说英语"); } }
//黄色人种抽象类 public abstract class AbstractYellowHuman implements Human { @Override public void getColor() { System.out.println("黄种人黄色皮肤"); } @Override public void talk() { System.out.println("黄种人说汉语"); } }
每个人种抽象类会有两个实现,以性别来定义。
public class FemaleBlackHuman extends AbstractBlackHuman { @Override public void getSex() { System.out.println("黑人女性"); } }
public class MaleBlackHuman extends AbstractBlackHuman { @Override public void getSex() { System.out.println("黑人男性"); } }
另外两个抽象类的实现相类似,不再赘述。
产品类说清楚了,接下来说工厂类。主要有两个工厂类,一个是男性工厂类,一个是女性工厂类。
工厂类的接口public interface HumanFactory
{
//制造一个黑人
public Human createBlackHuamn();
//制造一个白人
public Human createWhiteHuman();
//制造一个黄人
public Human createYellowHuman();
}男性工厂类的接口实现
public class MaleFactory implements HumanFactory
{
@Override
public Human createBlackHuamn()
{
return new MaleBlackHuman();
}
@Override
public Human createWhiteHuman()
{
return new MaleWhiteHuman();
}
@Override
public Human createYellowHuman()
{
return new MaleYellowHuman();
}
}
女性工厂类的接口实现
public class FemaleFactory implements HumanFactory
{
@Override
public Human createBlackHuamn()
{
return new FemaleBlackHuman();
}
@Override
public Human createWhiteHuman()
{
return new FemaleWhiteHuman();
}
@Override
public Human createYellowHuman()
{
return new FemaleYellowHuman();
}
}
针对以上两个工厂类,可以创建不同性别不同肤色的人。
以上模式就HumanFactory.java接口依赖Human.java接口,而不需要指定他们具体的实现类。
在抽象工厂模式中,AbstractBlackHuman,AbstractWhiteHuman,AbstractYellowHuman等抽象类可以定义为产品族,HumanFactory定义为抽象工厂。
需要注意:有N个产品族,在抽象工厂类中就应该有N个创建方法。
需要注意:有M个产品等级就应该有M个实现工厂类,每个实现工厂中,实现不同产品族的生产任务。
在这样的设计模式中,没有任何一个方法与实现类有关系,对于一个产品来说,我们只要知道它的工厂方法就可以直接产生一个产品对象,无须关心它的实现类。
优点:封装性,每个产品的实现类不是高层模块关心的,它关心接口和抽象类,只需要关心工厂类是谁,就能创建出一个需要的对象。
产品族的内部的约束为非公开状态。
缺点:产品族扩展困难,如果增加一个产品族,就需要在HumanFactory中增加方法,实现类同样要增加方法。
但是产品等级的扩展很简单,只需要为新的产品等级新增一个工厂类实现。
相关文章推荐
- 定时器触发任务放入队列
- IP选路
- LeetCode|Pascal's Triangle-java
- Nullability Annotations
- struts1工作原理
- linux中nginx
- 利用layer的mask属性实现逐渐揭示的动画效果
- 4s 恢复
- 最长连续子数组和为0
- C#中实现一次执行多条带GO的sql语句实例
- where 1=1的作用
- Qt Virtual Keyboard
- C语言的static
- 【转载】梦断计院--一个计算机学院学生大学学习生活的回顾与反省
- Java中finalize()用法
- 排序(一)之冒泡排序
- iOS基础-UIScrollView、UIPageControl
- 1.3 CentOS7设置FTP
- 二维数组中每行最大值
- UVa1612 Guess