抽象工厂模式

里面有几个概念:抽象工厂、实体工厂、抽象产品、实体产品

抽象工厂:定义创建产品的抽象方法

实体工厂:详细的创建哪种产品

抽象产品:一个接口或基类

实体产品:实现详细功能,或派生

类图

//抽象产品1
public interface IProduct1 {
public void show();
}
//抽象产品2
public interface IProduct2 {
public void show();
}
//实体产品1
public class Product1 implements IProduct1 {
public void show() {
System.out.println("创建了1型产品");
}
}
//实体产品2
public class Product2 implements IProduct2 {
public void show() {
System.out.println("创建了2型产品");
}
}
/*
* 1A 1B属于Product1 同一产品等级结构中
* 2A 2B属于Product2
*/
public class GradeProduct1A extends Product1 { @Override
public void show() {
super.show();
System.out.println("这是产品1下的:产品A");
} }
public class GradeProduct1B extends Product1 {

	@Override
public void show() {
super.show();
System.out.println("这是产品1下的:产品B");
}
}
public class GradeProduct2A extends Product2 {

	@Override
public void show() {
super.show();
System.out.println("这是产品2下的:产品A");
}
}
public class GradeProduct2B extends Product2 {

	@Override
public void show() {
super.show();
System.out.println("这是产品2下的:产品B");
}
}
//抽象工厂 创建不同的抽象产品
public interface IFactory {
public IProduct1 createProduct1A();//1类产品 型号A
public IProduct1 createProduct1B();//1类产品 型号B
public IProduct2 createProduct2A();//2类产品 型号A
public IProduct2 createProduct2B();//2类产品 型号B
}
//实体工厂 创建实体产品,返回类型为抽象产品
public class Factory implements IFactory { public IProduct1 createProduct1A() {
return new GradeProduct1A();
} public IProduct1 createProduct1B() {
return new GradeProduct1B();
} public IProduct2 createProduct2A() {
return new GradeProduct2A();
} public IProduct2 createProduct2B() {
return new GradeProduct2B();
}
}
/*
* 抽象工厂模式:用来创建一组相关或者相互依赖的对象
*
* 流程:抽象工厂,实体工厂 生产产品
* 抽象产品。实体产品 实现产品功能
* 缺点:当须要添加一个产品(由抽象和实体构成)。工厂都须要更改
*/
public class Test4Abstract {
public static void main(String[] args) {
IFactory factory = new Factory();
IProduct1 product1a = factory.createProduct1A();
product1a.show();
IProduct1 product1b = factory.createProduct1B();
product1b.show(); IProduct2 product2a = factory.createProduct2A();
product2a.show();
IProduct2 product2b = factory.createProduct2B();
product2b.show();
}
}

最新文章

  1. 港真,到底应该选择OA还是BPM?
  2. hdu4607 Park Visit(树的直径)
  3. 深入理解CSS中的空白符和换行
  4. servlet监听器Listener(理论+例子)
  5. 利用securecrt在linux与windows之间传输文件
  6. Transact-SQL三值逻辑
  7. 前端工具之WebPack解密--使用
  8. 经常使用ARM汇编指令
  9. $ cd `dirname $0` 和PWD%/* shell变量的一些特殊用法
  10. virtio-win 驱动
  11. 玩转微信小程序
  12. 【转】DHCP协议详解
  13. Java之IO流进阶篇:内存流,打印流,对象流
  14. vue通过自定义指令 v-py 将名字转拼音
  15. 使用HTML meta no-cache标签来禁用缓存
  16. mysql连接报java.math.BigInteger cannot be cast to java.lang.Long异常
  17. MongoDB的基本查询
  18. PMM 对MYSQL 的监控配制
  19. delphi正则表达式学习笔记(一)
  20. jwt身份认证

热门文章

  1. python--12、索引知识
  2. springboot项目中,@transactional 无效
  3. Errors reported here must be corrected before the service can be started
  4. python生成动态个性二维码
  5. 华硕(ASUS)X554LP笔记本在64位win7下无线网络连接问题
  6. 【译】x86程序员手册23-6.5组合页与段保护
  7. 安卓app测试之Monkey日志分析
  8. Python基础之字符的编码
  9. 关于MD5解密网站。www.cmd5.com
  10. Oracle 参数文件