抽象工厂模式,可以向客户端提供一个接口,而客户端不用指定具体的类型创建对象,却能够创建多个产品族(一类具有共性产品,如地域等)的对象。

下面直接上代码。

1.苹果需要实现水果的接口,而苹果可以有北方的苹果,也可以有南方的苹果,所以也可以抽象成一个父类。

 public interface Fruit {
public void Get();
} public abstract class Apple implements Fruit{
public abstract void Get();
}

2.南北方的苹果均需要继承这个父类,并实现父类的中的get方法。

 public class NorthApple extends Apple {
public void Get() {
System.out.println("北方苹果");
}
} public class SouthApple extends Apple {
public void Get() {
System.out.println("南方苹果");
}
}

3.香蕉的做法与苹果类似,抽象的父类继承水果接口,假设南北方都有香蕉吧。

 public abstract class Banana implements Fruit {
public abstract void Get() ;
} public class SouthBanana extends Banana {
public void Get() {
System.out.println("南方香蕉");
}
} public class NorthBanana extends Banana {
public void Get() {
System.out.println("北方香蕉");
}
}

4.这样创建的就都创建完成了。这时候我们考虑的问题,我们要想获得苹果的对象,或者获得香蕉的对象,应该有这样一个工厂去获得。但是苹果与香蕉是分南北的,所以我们需要南北工厂,这两个工厂就是“族”的概念。

这时候可以抽象出水果工厂的接口,接口中的方法分别是获取苹果对象,香蕉对象。

 public interface FruitFactory {
public Fruit getApple();
public Fruit getBanana();
}

5.南北工厂需要实现这个接口。

 public class SouthFruitFactory implements FruitFactory {
public Fruit getApple() {
return new SouthApple();
}
public Fruit getBanana() {
return new SouthBanana();
}
} public class NorthFruitFactory implements FruitFactory {
public Fruit getApple() {
return new NorthApple();
}
public Fruit getBanana() {
return new NorthBanana();
}
}

6.这样两个产品族就创建完成了,我们只需要在主客户端中创建南方的工厂,就可以通过调用getApple()方法,得到南方苹果的实例。其他亦然。

 public class MainClass {
public static void main(String[] args) {
FruitFactory factory=new NorthFruitFactory();   //获取北方水果工厂的实例
Fruit apple=factory.getApple();   //北方苹果
Fruit banana=factory.getBanana();    //北方香蕉
apple.Get();
banana.Get(); FruitFactory factory2=new SouthFruitFactory();   //获取南方水果工厂的实例
Fruit apple2=factory2.getApple();     //南方苹果
Fruit banana2=factory2.getBanana();   //南方香蕉
apple2.Get();
banana2.Get();
}
}

个人理解,这个抽象工厂模式,在主客户端调用的时候,只需要获取相应的工厂,就可以得到想要的对象(不用指定具体要获取的对象),实现相应的方法。这里与最开始抽象工厂的方法结合着理解就ok。

最新文章

  1. java 线程 障碍器
  2. Windows Phone中扩展WebBrowser使其支持绑定html内容
  3. MySQL排序原理与MySQL5.6案例分析【转】
  4. 黄聪:使用WORDPRESS自带AJAX方法
  5. [luogu]P1379 八数码难题[广度优先搜索]
  6. OC金额转大写
  7. python脚本,计算起点终点高程
  8. BI过程简述
  9. 【BZOJ5250】[九省联考2018]秘密袭击(动态规划)
  10. html5-新元素新布局模板-完善中
  11. Exp1 逆向与bof基础
  12. linux下搭建我的世界spongeforge 服务器 (海绵端)
  13. javascript面向对象的程序设计之Object.getOwnPropertyDescriptor()
  14. Django的DRF序列化方法
  15. python SQLAlchemy复习
  16. 简说mvc路由
  17. 20155222 2016-2017-2 《Java程序设计》第9周学习总结
  18. centos7-sar工具的安装过程及其简单应用
  19. How to: Cancel a Task and Its Children
  20. MiniHttpServer

热门文章

  1. Web 网站 故障常用分析命令
  2. man info --help区别
  3. (简单) POJ 2352 Stars,Treap。
  4. Linux 环境编译安装mysql (源码安装包)
  5. ajax原理图解
  6. uCOS-iii 中定义的一些常量
  7. ARM处理器简介
  8. Linux之文件压缩与解压
  9. bzoj3942——2016——3——15
  10. Python3基础 用 while循环实现 斐波那契数列