android 设计模式之工厂模式
1.定义:
定义一个用于创建对象的接口,让子类去决定实例化那个类。
2.四大角色:
2.1、抽象工厂:工厂方法模式的核心,任何在模式中创建对象的工厂类必须实现这个接口。
2.2、具体工厂:实现了抽象工厂接口的具体JAVA类。具体工厂角色含有与业务密切相关的逻辑,并且受到使用者的调用以创建导出类。
2.3、抽象角色:工厂方法模式所创建的对象的超类。
2.4、具体角色:实现抽象角色的某个具体角色的实例。
3.优点:
3.1、工厂方法模式是完全符合开闭原则的;
3.2、摈弃了简单工厂模式的缺点;
3.3、工厂模式是一种典型的解耦模式,可以降低对象之间的耦合度;
3.4、工厂模式是依靠抽象架构的,它把实例化产品的任务交由实现类完成,扩展性比较好。
3.5、可以使代码结构清晰,有效地封装变化。
3.6、对调用者屏蔽具体的产品类。如果使用工厂模式,调用者只关心产品的接口就可以了,至于具体的实现,调用者根本无需关心。即使变更了具体的实现,对调用者来说没有任何影响。
4.简单的示例
1.抽象对象:
public interface Lottery { public String getLotteryName(); }
2.具体对象:
public class FootballLottery implements Lottery{ @Override public String getLotteryName() { return "足球彩票"; } }
public class FutureLottery implements Lottery { @Override public String getLotteryName() { return "福利彩票"; } }
3.核心抽象工厂
public interface LotteryFactoty { //子类调用该方法返回一个Lottery对象,从而使工厂与角色建立联系。 public Lottery getLottery(); }4.具体工厂
public class FootballFactory implements LotteryFactoty{ @Override public Lottery getLottery() { return new FootballLottery(); } }
public class FutureFactory implements LotteryFactoty { @Override public Lottery getLottery() { return new FutureLottery(); } }下面就是如何使用上面的工厂来获取我们想要的实例类呢,看下面
LotteryFactoty factoty = new FootballFactory(); Lottery lottery = factoty.getLottery(); Log.e("MainActivity","lottey ="+lottery.getLotteryName());这样可以很方便的获取到想要的足球彩票这个实例, 至于具体的实现,调用者factory根本无需关心。即使变更了具体的实现,对调用者来说没有任何影响。如果需要获取福利彩票只要;
LotteryFactoty factoty = new FutureFactory();补充说明一点:
父类引用指向子类对象的问题:
定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。这就是“向上转型”。
那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特, 定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。 所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,父类引用是无法调用的;(原因之一是为了弥补java 单继承而不像C++的多继承的功能限制问题)。