Android设计模式(十二)--抽象工厂模式
问题:
抽象工厂模式,是一个,狠恶心的模式,那么这个模式在Android有没实用到过呢?
1、定义:
抽象工厂模式:为创建一组相关或者是相互依赖的对象提供一个接口,而不须要指定他们的详细类。
2、使用:
2.1、不依赖于产品类实例怎样被创建。组合和表达的细节。
2.2、产品有多于一个的产品族,而系统仅仅消费当中某一族的产品;
2.3、同属于同一个产品族是在一起使用的。
2.4、提供一个产品类的库,全部产品以相同的接口出现,从而使使用者不依赖于实现;
3、与工厂方法的差别:
3.1、抽象工厂是面向一个工厂方法的升级;
3.2、抽象方法提供的是一个产品族。即多个产品等级结构。而工厂方法则是针对一个产品等级结构;
3.3、抽象方法提供的产品是衍生自多个抽象或者接口。而工厂方法则衍生自同一个抽象或者接口;
4、长处:
4.1、因为是工厂方法的升级,因此继承了工厂方法的全部长处;
4.2、能够在内部对产品族的产品进行对应的约束。
4.3、方便的切换产品族。
5、缺点:
5.1、不易拓展。新的产品族出现,抽象工厂以及对应的实现都须要改动。
6、终于的目的:
设计模式的目的终于是为了解除耦合,那么使用时,当工厂方法。加入某些方法。而形成的产品族时,便成为了抽象工厂,当抽象工厂降低某些方法变的单一时。便成为工厂方法。
使用模式只为了更好的维护与拓展。
7、简单的demo:
在彩票中有双色球。大乐透,等彩种,也有各种地方性的彩种,为了demo的方便,我将SSQ,DLT也划分为地方性彩种;
每一个地方。都有这两个彩种,从而形成产品族。
package com.example.demo.AbstractFactory; /** * 抽象工厂。得到产品 * @author qubian * @data 2015年6月12日 * @email naibbian@163.com * */ public interface LotteryFactory { public LotterySSQ getSSQ(); public LotteryDLT getDLT(); } package com.example.demo.AbstractFactory; /** * 产品接口 * @author qubian * @data 2015年6月12日 * @email naibbian@163.com * */ public interface LotterySSQ { public String getRandom(int num); } package com.example.demo.AbstractFactory; /** * 产品接口 * @author qubian * @data 2015年6月12日 * @email naibbian@163.com * */ public interface LotteryDLT { public String getRandom(int num); }
详细工厂:
package com.example.demo.AbstractFactory; /** * 详细工厂 湖北工厂 * @author qubian * @data 2015年6月12日 * @email naibbian@163.com * */ public class HBFactory implements LotteryFactory{ @Override public LotterySSQ getSSQ() { return new HBssq(); } @Override public LotteryDLT getDLT() { return new HBdlt(); } } package com.example.demo.AbstractFactory; /** * 详细产品 湖北双色球 * @author qubian * @data 2015年6月12日 * @email naibbian@163.com * */ public class HBssq implements LotterySSQ{ @Override public String getRandom(int num) { return null; } } package com.example.demo.AbstractFactory; /** * 详细产品。湖北大乐透 * @author qubian * @data 2015年6月12日 * @email naibbian@163.com * */ public class HBdlt implements LotteryDLT{ @Override public String getRandom(int num) { // TODO Auto-generated method stub return null; } } package com.example.demo.AbstractFactory; /** * 详细工厂 湖南工厂 * @author qubian * @data 2015年6月12日 * @email naibbian@163.com * */ public class HNFactory implements LotteryFactory{ @Override public LotterySSQ getSSQ() { return null; } @Override public LotteryDLT getDLT() { return null; } }
详细使用:
package com.example.demo.AbstractFactory; /** * 使用 * @author qubian * @data 2015年6月12日 * @email naibbian@163.com * */ public class UseAbstractFactory { public void use() { // 使用时的产品族 能够随时方便切换 // LotteryFactory factory = new HNFactory(); LotteryFactory factory = new HBFactory(); LotterySSQ ssq = factory.getSSQ(); ssq.getRandom(7); LotteryDLT dlt =factory.getDLT(); dlt.getRandom(8); } }
8、Android的说明:
因为抽象工厂不易于拓展新的产品族,所以这样的设计模式,在提供对外部人员訪问时。非常少使用,所以在Android源代码中,基本是没有这样的设计模式,当然也许也是我没有找到吧,只是我想应该是没有的。
9、运用最为典范:
9.1 模式设计之初:就是为了适应在Unix与Windows两个操作系统下的视图(buttonButton。TextView等),而构建视图族,视图族中有各自不同的实现;
9.2在java 的连接数据库的操作中,对不同的数据库的操作而形成的对象操作族。就是一种非常好的模式设计;可是当再次更换数据时,所须要造成的接口的改动也是十分恶心,所以这样的模式拓展性不好!
当然,既然模式设计出来就有其长处与可用性。仅仅是临时在Android源代码中没有发现,也许能够在自己的代码中实现。同一时候也期待和等待出现的惊喜。