抽象工厂模式(Abstract Factory)
上文讲到的工厂模式会有一个模式本身带有的客观问题,即所有实例的创建都必须依赖一个工厂类。这样在某种程度上是有背设计原则中的开闭原则。当业务需求发生改变时,如果想要拓展实例的创建,就必须对工厂类进行修改。所以,抽象工厂模式就应用而生了,通过创建多个工厂类,来提高程序的拓展性。这次我们来举例“鸟”,鸟都有飞行的行为,我们先创建飞行接口:
- public interface Fly{
-
public void FlyBehavior();
- }
接着实现两个类,大鸟和小鸟: - public class BigBird implements Fly{
-
@Override
-
public void FlyTime() {
-
System.out.println("i can fly three hours!");
-
}
- }
- public class SmallBird implements Fly{
-
@Override
-
public void FlyTime() {
-
System.out.println("i can fly an hour!");
-
}
- }
然后我们先提供一个接口,接口中创建一个返回类型为飞行接口的方法,用于创建对应的鸟类型: - public interface Producer{
-
public Fly createBird();
- }
最后,我们创建两种类型鸟的工厂类实现上面的接口: - public class ProducerBigBirdFactory implements Producer{
-
@Override
-
public Fly createBird(){
-
return new BigBird ();
-
}
- }
- public class ProducerSmallBirdFactory implements Producer{
-
@Override
-
public Fly createBird() {
-
return new SmallBird ();
-
}
- }
测试类:
- public class Test {
-
public static void main(String[] args) {
-
//创建大鸟工厂
-
Producer producer= new ProducerBigBirdFactory ();
-
BigBird bigBird= producer.createBird();
-
bigBird.FlyTime();
-
//创建小鸟工厂
-
Producer producer1= new ProducerSmallBirdFactory ();
-
SmallBird smallBird= producer1.createBird();
-
smallBird.FlyTime();
-
}
- }
控制台打印:
i can fly three hours!
i can fly an hour!
通过上述示例,我们就可以创建更多的鸟类型了,而不用去修改已有的稳定生产的工厂类了。只需要实现Fly接口,创建新的鸟品种,再接着实现Producer接口,创建生产新品种鸟的工厂类即可。