BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #40899同步于 2015/5/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

乱写一通之抽象工厂

sgoal
2015/5/19镜像同步3 回复
乱写一通,希望大家轻拍,有错的话欢迎指出 准备知识: 抽象类 匿名类 接口 多态 什么是抽象工厂 根据GoF的解释:抽象工厂的意图是提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们的具体的类。 是不是有点懵?那就对了。翻译为大白话的意思就是,创建一个接口(假设叫做)Factory,这个接口可以创建某一个类(假设叫做Animal)相关的所有对象(假设叫做Food),但是你不知道也不用关心这个Factory是如何创建的。 用它来干啥 假设我们要创建一个喂食器(假设叫做Feeder),我们要让这个Feeder非常通用,那么它就要和动物实现松耦合,也就是说它不用知道再喂养的是什么动物,单纯的喂就好了。 下面我给出它的实现: class Feeder{ Factory fac; public Feeder(Factory f) { this.fac =f; } void feedAnimal(){ Animal a = fac.createAnimal(); Food food = fac.createFood(); a.eat(food); } } 这个Feeder类有持有一个工厂Factory,这个工厂可以创建出动物Animal和食物Food,然后将食物喂给动物吃。是不是很简单的就实现了一个比较通用的Feeder. 看看我们如何使用它。 public static void main(String[] args) { Feeder catfeeder = new Feeder(new CatFac()); catfeeder.feedAnimal(); System.out.println("------"); Feeder dogFeeder = new Feeder(new DogFac()); dogFeeder.feedAnimal(); } 我们给Feeder传入不同的工厂CatFac和DogFac,它就会去实现喂不同动物的行为。下面我们来看看输出。 输出 cat eating this is cat food ------ dog eating this is dog food 分析输出: 当我们传入不同的工厂是,这个喂食器Feeder表现出了不同的行为,为什么?因为多态,不同的工厂创建出类不同的动物Animal和食物Food子类,从而实现出了不同的行为。这样做,我们的Feeder与Animal和Food实现松耦合。这样做的话,如果以后又有其他的动物,Bird啥的,那么我们只需要再创建一个’BirdFac’,然后这个喂食器就能够给Bird喂食了,这就是松耦合的好处。 抽象的定义 public abstract class Animal { public abstract void eat(Food f); } interface Food{ public void eaten(); } interface Factory{ Animal createAnimal(); Food createFood(); } 抽象工厂Factory要创建与动物Animal相关的食物Food,而动物Animal只要实现吃eat就好了。 Animal的实现 class Dog extends Animal{ @Override public void eat(Food f) { System.out.println("dog eating"); f.eaten(); } } class Cat extends Animal{ @Override public void eat(Food f) { System.out.println("cat eating"); f.eaten(); } } 工厂的实现 class CatFac implements Factory{ @Override public Animal createAnimal() { return new Cat(); } @Override public Food createFood() { return new Food(){ @Override public void eaten() { System.out.println("this is cat food"); } }; } } class DogFac implements Factory{ @Override public Animal createAnimal() { return new Dog(); } @Override public Food createFood() { return new Food() { @Override public void eaten() { System.out.println("this is dog food"); } }; } } 在工厂中,用匿名类实现了不同动物吃的食物,这样比较方便。 总结 使用抽象工厂,你可以为一系列的抽象创建对象,但是你不用关心它的具体实现类,这样你写出来的代码也会实用与这一系列抽象,而不是只能用于某一个具体的抽象类,如Feeder可以给所有的动物喂食,只要这个动物有相应的Factory即可,这样松耦合的代码能够轻松的实现代码的复用。 原文http://godoubao.com/2015/05/19/abstract-factory/
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
melot机器人#1 · 2015/5/19
前排学习
JulianLiao机器人#2 · 2015/5/22
真心不错,学习了
fuxuemingzhu机器人#3 · 2015/5/22
先马再看