标签:FruitFactory 水果 模式 工厂 getFruit Fruit 设计模式 public
还记得前面的简单工厂模式么?我们开了一个水果工厂FruitFactory
,生产三种水果Apple
,Pear
,Orange
。今天给大家讲讲工厂方法模式:
老板搞水果工厂赚了点小钱,准备扩大生产,每个工厂生产一种水果,各司其职,而不是把所有的产品类型都放到一个工厂中。
既然有多工厂,那我们和之前一样,搞一个水果工厂类FruitFactory
,把它搞成接口类。
import factory.Fruit;public interface FruitFactory { public Fruit getFruit();}
水果类的定义还是一样,定义一个水果接口Fruit
:
public interface Fruit { public void process();}
水果分别如下,我直接写到一块去了:
public class Apple implements Fruit { public void process() { System.out.println("I am an Apple"); }}public class Pear implements Fruit { public void process() { System.out.println("I am a Pear"); }}public class Orange implements Fruit { public void process() { System.out.println("I am an Orange"); }}
既然有多个工厂。那我们分别定义多个工厂,对水果工厂类做不同的实现,分别生产苹果,雪梨,橙子。
public class AppleFactory implements FruitFactory { public Fruit getFruit(){ return new Apple(); }}public class PearFactory implements FruitFactory { public Fruit getFruit(){ return new Pear(); }}public class OrangeFactory implements FruitFactory { public Fruit getFruit(){ return new Orange(); }}
测试代码如下:
public class FruitTest { public static void main(String[] args) { FruitFactory appleFactory = new AppleFactory(); Fruit apple = appleFactory.getFruit(); apple.process(); FruitFactory pearFactory = new PearFactory(); Fruit pear = pearFactory.getFruit(); pear.process(); }}
运行结果:
I am an Apple I am an Pear
上面的写法,如果后续还有生产不同的水果,或者不同的水果工厂,相对容易拓展。总结一下,工厂方法模式一共有以下的角色:
- 抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法
getFruit()
来创建水果产品。 - 具体工厂:主要是实现抽象工厂中的抽象方法,创建具体的产品。
- 抽象产品:定义了产品规范,比如所有的水果共同的特性。
- 具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
那么工厂方法模式,相对简单工厂模式,有什么区别呢?
工厂方法模式,一种工厂对应一种产品,各司其职,如果产品很多的话,方便分开维护,特别是那种创建产品比较复杂的场景,而产品类型又比较多,这样就会显得很臃肿。
但是如果产品很少,而且创建过程相对简单的时候,感觉简单工厂模式已经足够,不需要特意为了使用一种设计模式而使用它,过度设计会带了很多不必要的麻烦。
【作者简介】:
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。这个世界希望一切都很快,更快,但是我希望自己能走好每一步,写好每一篇文章,期待和你们一起交流。
标签:FruitFactory,水果,模式,工厂,getFruit,Fruit,设计模式,public 来源: https://blog.51cto.com/u_13604316/2729787
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。