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

一、介绍,定义

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

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

二、使用场景

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

三、UML类图

9ab1fedf7bb6

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();

}

}

结果如下

9ab1fedf7bb6

9.png

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

五、模式的优缺点:

优点:

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

缺点:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web前端期末大作业--响应式健身会所网页设计(HTML+CSS+JS)实现

临近期末, 你还在为HTML网页设计结课作业,HTML网页作业无从下手?没有合适的模板?等等一系列问题。你想要解决的问题,在专栏👇🏻👇🏻👇🏻 java项目精品实战分享案例《100套…

Web前端期末大作业-响应式室内家具网页设计(HTML+CSS+JS)实现

作者主页:Java李杨勇 文末获取源码联系 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?网页要求的总数量太多?HTML网页作业无从下手?没有合适的模板?等等一系列问题。你想要解决的问题&#xff0c…

Java基础项目实战--大学生求职招聘信息网站系统

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、【java李杨勇】公号作者✌ 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 临近学期结束&#xff…

IDEA运行VUE npm install报错:chromedriver@2.27.2 install: node install.js

报错截图: 解决方法: npm install chromedriver --chromedriver_cdnurlhttp://cdn.npm.taobao.org/dist/chromedriver

C++ 比 C语言增加的新特性 3 之 命名空间namespace

1. 命名空间 1.1 命名空间 又称为“名字空间”,在内存(全局)中取一块区域并对其进行命名 实际例子: 同一个班级,两个同姓的人,例如:张三和张三,其中一个张三座位是在讲台右边&am…

Web前端期末大作业-响应式唯美婚庆公司网站网页设计(HTML+CSS+JavaScript)

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、【java奥斯卡】公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 文末获取源码联系 🍅 临近期末,…

挑战记忆力-Web前端实现记忆纸牌游戏(JS+CSS)

游戏介绍: js实现扑克牌翻牌记忆小游戏代码、连续点击翻开两张扑克牌,相同去重,不同则合上重新翻,考验你的记忆力。 🍅 文末获取源码联系 🍅 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头…

IDEA 启动、编译、clean、安装maven等、报错Process terminated

报错原因:找不到settings.xml 解决方法:

html5 写json 文件,HTML5实现本地JSON文件的读写

参考:使用HTML5来实现本地文件读取和写入 (FileReader读取json文件,FileSaver.js保存json文件)JS创建、写入、读取本地文件(txt) (ActiveXObject 这玩意根本不能用,IE10 和 Chrome都试了)HTML 5中的文件处理之File Writer API (FileSaver…

Vue取消eslint语法限制

启动vue项目的时候经常报一大堆错误、但是不影响项目运行、 这是因为vue对语法的限制过于严格造成的 > bblee-app1.0.0 dev /Users/bianlifeng/my-project > webpack-dev-server --inline --progress --config build/webpack.dev.conf.js95% emitting …

html5中figure怎么用,figure 和 figcaption 元素的正确使用方式

figure和figcaption是两个经常在一起使用的语义化元素。如果你还没有在规范中了解过他们,没有机会在项目中使用过他们,或者说现在对他们还是一无所知,这里就给大家讲一些如何正确使用他们的小技巧。figure元素经常用于图片,如下所示:figure元…

Web前端期末大作业-响应式艺术培训机构网页设计(bootstrap+HTML+CSS+JavaScript+)实现

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、【java奥斯卡】公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 文末获取源码联系 🍅 临近期末,…

Java毕业设计--健康推广管理系统项目实战【Springboot+mybatis+layui等实现】

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、【java李杨勇】公号作者✌ 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 临近学期结束&#x…

为计算机新建一个用户,win10

怎样在安装Win10系统时不创建Microsoft账户怎样在安装Win10系统时不创建Microsoft账户 在安装Win10系统的过程中,最让用户困扰的估计就是安装过程的最后一个步骤:登陆Microsoft账户。很多用户既没有Microsoft账户,也不想用它登陆系统&#xf…

Web前端期末大作业--响应式美女健身教练瑜伽馆网页设计(HTML+CSS+JavaScript+)实现

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、【java奥斯卡】公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 文末获取源码联系 🍅 临近期末,…

Java经典课程设计--在线蛋糕商城销售网站项目【SpringMvc+mybatis+bootstrap等实现】

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、【java李杨勇】公号作者✌ 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 临近学期结束&#x…

Web前端期末大作业--绿色自适应医疗健康医院网页设计(HTML+CSS+JavaScript+)实现

临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?网页要求的总数量太多?HTML网页作业无从下手?没有合适的模板?等等一系列问题。你想要解决的问题,在专栏👇🏻👇&…

修复计算机的英语,Windows Repair最新版

Windows Repair是一个全能型的电脑系统修复工具,能将你的windows恢复到初始设置。可以帮你解决诸如注册表权限问题、ie、自动更新、防火墙等等一系列故障。【功能特点】1、系统自动修复:用它可以智能安全地自动修复被非法软件篡改的系统设置,…

SpringBoot配置图片虚拟映射

1. 新建一个MyWebAppConfigurer 配置静态资源需要映射的位置、建议把addResourceLocations的路径写在application.yml中、方面以后部署的打包修改配置文件的时候做外部配置文件加载、方面修改。这边为了节约时间就在代码中写了。 package io.renren.config; import org.springf…

计算机回收站怎么设计无法删除,电脑回收站中ai文件删不掉如何解决? ai文件在回收站删不掉的解决办法...

电脑回收站中ai文件删不掉该怎么办?在清理电脑回收站的时候,发现很多.ai文件都删不掉,粉碎也不行,这是怎么回事?下面我们来看看ai文件在回收站删不掉的解决办法,具体内容如下一些做平面设计的用户可能会在网…