抽象工厂模式
来源:互联网 发布:淘宝天猫美工 编辑:程序博客网 时间:2024/06/05 17:11
抽象工厂模式(Abstract Factory)
在看抽象工厂模式之前,希望大家先去看一下我另一篇博客:
工厂方法模式
在了解了工厂方法模式之后,我们会发现一个问题,类的创建会依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?
我们试着看看抽象工厂模式。
抽象工厂模式:就是创建多个工厂类,这样一但需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
接下来我们看代码来理解。
我们以Animal接口,Dog类,Cat类为例,看一下继承关系。
Animal.Java代码:
public interface Animal {public void play();}
public class Dog implements Animal{ @Override public void play() { System.out.println("I am a dog!"); } }
Cat.java代码:
public class Cat implements Animal{ @Override public void play() { System.out.println("I am a cat!"); } }
Animal为所有动物类的父接口,在接口中定义了统一的抽象方法 play(); ,动物子类复用这个抽象方法并实现细节。
Dog类继承了Animal接口,并实现了接口中的抽象方法play();。
Cat类继承了Animal接口,并实现了接口中的抽象方法play();。
接下来我们再来写一个工厂接口。
AnimalFactory.java代码:
public interface AnimalFactory {public Animal produce();}
所以我们要分别为Dog类和Cat类创建工厂类。
DogFactory.java代码:
public class DogFactory implements AnimalFactory{@Overridepublic Animal produce() {return new Dog();}}CatFactory.java代码:
public class CatFactory implements AnimalFactory{@Overridepublic Animal produce() {return new Cat();}}
最后我们写一个测试类来测试一下。
AnimalTest.java代码:
public class AnimalTest {public static void main(){AnimalFactory animalFactory = new DogFactory();Animal dog = animalFactory.produce();dog.play();} }
控制台输出结果如下:
I am a dog!
可以看到我们为AnimalFactory接口创建了一个DogFactory的子类实现,然后调用它的produce();方法返回一个Dog类对象,把Dog类对象交给Animal接口,再使用它的play();方法在控制台输出结果。
其实这个模式的好处就是,如果你现在想增加一个功能:比如在增加一个动物鱼,则只需增加一个Fish实现类,实现Animal接口,同时做一个FishFactory工厂类,实现AnimalFactory接口,就OK了,无需去改动现成的代码。这样做,能够更好的拓展。
阅读全文
0 0
- 工厂模式 -- 抽象工厂
- 工厂模式-抽象工厂
- 工厂模式-抽象工厂
- 工厂模式/抽象工厂模式
- 工厂模式&&抽象工厂模式
- 工厂模式---抽象工厂模式
- 工厂模式&抽象工厂模式
- 工厂模式,抽象工厂模式
- 【模式】抽象工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂&工厂模式&抽象工厂模式
- 工厂方法,抽象工厂模式
- 2,工厂模式--抽象工厂
- C#工厂模式-抽象工厂
- 工厂模式与抽象工厂
- 抽象工厂设计模式
- 抽象工厂模式
- Wannafly模拟赛 矩阵 二维矩阵hash
- 四旋翼飞行器教学笔记1 ——四轴飞行器飞行原理简介
- java编程思想之操作符
- Laravel操作数据库
- STM32开发环境搭建
- 抽象工厂模式
- 你在那里,我却在这里
- LeetCode有问题的代码
- jquery deferred对象 then(),when()方法 ,解决回调函数嵌套
- oracleの知識ポイント
- 数据结构 — 快速排序
- nginx tar.gz安装方法+简单静态文件配置
- Spring源码阅读(三)—IOC容器依赖注入
- Ubuntu编译Android源码过程中的空间不足解决方法