一、介绍,定义

抽象工厂模式也是创建型模式之一,抽象工厂模式起源于对不同操作系统的图形化解决方案,如不同操作系统的按钮和文本框控件及其实现。

为创建一组相关或者相互依赖的对象提供接口,而不需要具体指定他们的具体类。

二、使用场景

一个对象族有相同的约束时可以使用抽象工厂模式。(比如Android、IOS、Windows Phone下都有短信和拨号软件)

三、UML类图

8.png

AbstractFactory:抽象工厂角色,声明了一组用于创建一种产品的方法,每个方法对应生产一种产品,上面生成产品A和B。

ConcreteFactory:具体工厂角色,实现了抽象工厂中定义的创建产品的方法,生成一组具体的产品,每一个产品又位于某个产品等级中。

AbstractProduct:抽象产品角色,定义了每种产品应有的方法

ConcreteProduct:具体的产品角色,定义了具体工厂生产的具体产品对象,实现抽象产品中声明的方法。

四、通用模式代码

抽象的产品A和B

public abstract class AbstractProductA {

public abstract void method();

}

public abstract class AbstractProductB {

public abstract void method();

}

具体的产品A1,A2,B1,B2

public class ConcreteProductA1 extends AbstractProductA {

@Override

public void method() {

System.out.println("产品A1的方法");

}

}

public class ConcreteProductA2 extends AbstractProductA {

@Override

public void method() {

System.out.println("产品A2的方法");

}

}

public class ConcreteProductB1 extends AbstractProductB {

@Override

public void method() {

System.out.println("产品B1的方法");

}

}

public class ConcreteProductB2 extends AbstractProductB {

@Override

public void method() {

System.out.println("产品B2的方法");

}

}

抽象工厂:

public abstract class AbstractFactory {

public abstract AbstractProductA createProductA();

public abstract AbstractProductB createProductB();

}

具体的工厂1和2

public class ConcreteFactory1 extends AbstractFactory {

@Override

public AbstractProductA createProductA() {

return new ConcreteProductA1();

}

@Override

public AbstractProductB createProductB() {

return new ConcreteProductB1();

}

}

public class ConcreteFactory2 extends AbstractFactory {

@Override

public AbstractProductA createProductA() {

return new ConcreteProductA2();

}

@Override

public AbstractProductB createProductB() {

return new ConcreteProductB2();

}

}

五、简单实现

上一篇讲到,小民开了个Audi车组装工厂。随着小民生意越做越大,发现Q3,Q5,Q7使用的零件各不相同,他们的零件又有差别,Q3的发动机是国产的,轮胎是铁的。Q7的发动机是外国的,轮胎是塑料的。不同的轮胎,不同的发动机,都也是一种产品类型,这时候就能用抽象产品模式:

首先 汽车工厂需要生产轮胎、发动机、制动系统这三种部件:

public abstract class CarFactory {

//轮胎

public abstract ITire createTire();

//发动机

public abstract IEngine createEngine();

//制动系统

public abstract IBrake createBrake(); //返回 制动系统 对象

}

这里我们为每一个零件定义一个接口,并分别创建两个不同的实现类表示不同的零部件产品

public interface ITire {

//轮胎接口

void tire();

}

public class NormalTire implements ITire {

@Override

public void tire() {

System.out.println("普通轮胎");

}

}

public class SUVTire implements ITire {

@Override

public void tire() {

System.out.println("越野轮胎");

}

}

public interface IEngin {

//发动机

void engine();

}

public class DomesticEngin implements IEngin {

@Override

public void engine() {

System.out.println("国产发动机");

}

}

public class ImportEngin implements IEngin {

@Override

public void engine() {

System.out.println("进口发动机");

}

}

public interface IBrake {

//制动系统

void brake();

}

public class NormalBrake implements IBrake {

@Override

public void brake() {

System.out.println("普通制动");

}

}

public class SeniorBrake implements IBrake {

@Override

public void brake() {

System.out.println("高级制动");

}

}

具体的 不同的生产 车厂 Q3 生产厂

public class Q3Factory extends CarFactory {

@Override

public ITire createTire() {

return new NormalTire(); //返回普通的轮胎类

}

@Override

public IEngin createEngine() {

return new DomesticEngin(); //返回国产发动机

}

@Override

public IBrake createBrake() {

return new NormalBrake(); //返回一般制动

}

}

具体的 不同的生产 车厂 Q7 生产厂

public class Q7Factory extends CarFactory {

@Override

public ITire createTire() {

return new SUVTire(); //返回SUV 车胎

}

@Override

public IEngin createEngine() {

return new ImportEngin(); //返回进口轮胎

}

@Override

public IBrake createBrake() {

return new SeniorBrake(); //返回高级制动

}

}

客户类 具体的实例化调用 生产

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//构造一个生产Q3 的工厂

CarFactory factoryQ3 = new Q3Factory();

factoryQ3.createTire().tire();

factoryQ3.createEngine().engine();

factoryQ3.createBrake().brake();

//构造一个 生产Q7 的 工厂

CarFactory factoryQ7 = new Q7Factory();

factoryQ7.createTire().tire();

factoryQ7.createEngine().engine();

factoryQ7.createBrake().brake();

}

}

结果如下

9.png

可见当需要添加Q5时,对应的零件类又要增加,这是此模式一个弊端,就是类的徒增,如果工厂类过多,势必导致文件非常多,开发中一定要权衡。

五、模式的优缺点:

优点:

分离接口与实现,客户端使用抽象工厂来创建需要的对象,二客户端根本不知道具体实现的是谁,客户端只是面向产品的接口编程而已,使其从具体的产品实现中解耦,同时基于接口与实现的分离,使抽象工厂方法模式在切换产品类时更加灵活,容易。

缺点:

一是文件的爆炸性增加,而是不太容易扩展新的产品类,因为每当我们增加一个产品类就需要修改抽象工厂,那么所以的具体工厂均会被修改。

android 工厂模式创建,7、Android设计模式---(创建型设计模式)抽象工厂模式相关推荐

  1. 设计模式(6)——抽象工厂模式(Abstract Factory Pattern,创建型)

    1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.抽象工厂模式(Abstract Factory Pattern)属于创建型模式,为创建一组相关或者相互依赖的对象(产品族)提供一个抽象 ...

  2. 每天学习一个设计模式(八):创建型之抽象工厂模式

    目录 一.基本概念 二.通俗解释 三.应用场景 1.使用简单工厂模式的解决方案 2.抽象工厂模式 抽象工厂模式结构 在什么情况下应当使用抽象工厂模式 抽象工厂模式的起源 四.抽象工厂模式的优缺点 抽象 ...

  3. 【Java设计模式】简单学抽象工厂模式——你好,微信还是支付宝

    目录 说明 实现方式 自问自答 其他链接 说明 五大创建型模式之一,其他还有单例模式.原型模式.建造者模式.工厂模式. 抽象工厂模式(Abstract Factory Pattern):定义了一个in ...

  4. 设计模式-抽象工厂模式的应用场景及Java中对抽象工厂的应用

    1. 什么是抽象工厂模式 抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们的类 抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用 ...

  5. 设计模式是什么鬼(抽象工厂)

    转载自:https://mp.weixin.qq.com/s/8I-yHFrSNJJPol8McyzhMA 抽象工厂,意味着工厂的泛化,也就是说对多个工厂共通行为的抽取及概括.这和我们之前讲过的工厂方 ...

  6. 《设计模式入门》 3.抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类. 抽象工厂模式又称为Kit模式,属于对象创建型模式. 抽象工厂模式 ...

  7. 笔记:设计模式(3)-Abstract Factory抽象工厂模式

      工厂模式的起源 1.变化点在"对象的创建",因此就封装"对象创建": 2.面向接口编程,依赖接口,而非依赖实现. 动机(Motivation) 在系统中,经 ...

  8. Javascript设计模式(三)-- 抽象工厂模式

    抽象工厂模式:通过对类的工厂抽象使其业务用于对产品类簇的创建,而不负责创建某一类产品的实例. 抽象类 //测试抽象类,使用其实例方法时会抛出错误 var test = function(){}; te ...

  9. 设计模式笔记二:抽象工厂模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出,欢迎讨论. 简单定义: 抽象工厂模式(Abstract Factory Pattern) ...

  10. 设计模式---(3)抽象工厂模式

    抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最 ...

最新文章

  1. Layer 2 Tunneling Protocol
  2. oracle用户权限的管理
  3. JSP Workshop
  4. 兴城职高计算机,兴城学计算机,兴城学计算机去哪里,兴城学计算机一般工资能拿多少 - IT教育频道...
  5. 解决logstash启动过慢的问题
  6. python模拟微信投票_python 模拟微信投票
  7. QGIS的部分使用流程
  8. web视频播放器videojs
  9. 2440 led-管道-控制应用程序详细解释(摘抄+解释部分)
  10. oracle算加权平均的函数,excel中计算加权平均数的公式:用SUMPRODUCT和SUM函数计算加权平均数...
  11. 月薪达到1万的web前端工程师,都会些什么呢?(附路线资料)
  12. 从亏损19亿到盈利6亿,恺英网络做对了什么?
  13. 什么是局域计算机网络,什么是局域网_局域网概述
  14. 花了10分钟,终于明白矩阵的逆到底有什么用
  15. Linux 命令系统
  16. 数据的相似性和相异性的度量
  17. 三维重建 影像匹配 密集匹配三者的关系
  18. PHP 活动人选抽奖示例代码
  19. 报错:Use /* eslint-disable */ to ignore all warnings in a file.
  20. 解决python读取sqlserver数据库乱码问题

热门文章

  1. html内容点击按钮自动复制,HTML页面---复制按钮的使用(包含弹层)
  2. mysql怎样实现先判断后联合_MYSQ创建联合索引,字段的先后顺序,对查询的影响分析...
  3. java struct工作原理_Struts2的工作原理(图解)详解
  4. map集合的putall_Map.put和Map.putAll方法之间的区别?
  5. 火狐怎么放大页面?火狐浏览器页面放大技巧
  6. 转:javascript方法--bind()
  7. java中修改密码_java怎样修改用户名密码?
  8. 打开数据库_打开这份指南,数据库运维也能优雅、简单!
  9. MySQL保存或更新 saveOrUpdate
  10. OS复习——设备管理习题