工厂模式可以分成三类:
下面以一个什么水果都有的水果店举例子
package com.cat.factory; /** * 什么水果都有的水果店(工厂) */ public interface FruitFactory { //可以获取任何水果的方法 Fruit createFurit(); }
构建苹果和梨的工厂(继承着所有水果的工厂)
/** * 苹果工厂继承水果工厂 */ public class AppleFactory implements FruitFactory { /** * 创建水果 * @return */ @Override public Fruit createFruit(){ return new Apple(); } }
/** * 梨工厂继承水果工厂 */ public class PearFactory implements FruitFactory { /** * 创建梨 * @return */ @Override public Fruit createFruit() { return new Pear(); } }
还有我们的实体类:苹果、梨、水果(多态:苹果和梨都是水果,可以直接用水果来表示)
/** * 水果抽象类 */ public abstract class Fruit { // 所有水果都有颜色-抽象方法 public abstract void color(); }
/** * 苹果 */ public class Apple extends Fruit { @Override public void color() { System.out.println("苹果是红色的"); } }
/** * 梨 */ public class Pear extends Fruit { @Override public void color() { System.out.println("梨是黄色的"); } }
那么现在我想要买一个苹果,我就跟水果店老板说,老板就给我拿来苹果了,如下:
public class TestFruit { public static void main(String[] args) { //去苹果工厂找了一个苹果 FruitFactory f = new AppleFactory(); //老板就拿了一个苹果给客人 Fruit fruit = f.createFruit(); //苹果的颜色 fruit.color(); } }
优点:
缺点:
现在水果店生意不好做啊,很多水果都卖不出去了,于是老板只卖苹果和梨两种水果了。
所以我们的工厂是这样子的:
/** * 一个即可创建苹果又可创建梨的简单工厂 */ public class SimpleFruitFactory { public static Apple createApple(){ return new Apple(); } public static Pear createPear(){ return new Pear(); } /** * 如果外界(客人)想要苹果、梨,直接在这里创建就行了 */ public static Fruit createFruit(String type){ if("apple".equals(type)){ return createApple(); }else if("pear".equals(type)){ return createPear(); }else{ return null; } } }
获取苹果,梨:
public class TestFruit { public static void main(String[] args) { //苹果 Fruit apple = SimpleFruitFactory.createApple(); apple.color(); //梨 Fruit pear = SimpleFruitFactory.createPear(); pear.color(); } }
现在问题来了:
简单工厂类的优点也很明显:我就一个具体的工厂来创建对象,代码量少。
抽象工厂模式就比较复杂了,我们一般的应用都写不到。我首先来简述一下需求吧:
每一种水果都有它的价格
那我们的苹果和梨都是有价格的,不是贵的就是便宜的~~
具体的代码是这样的:
我们的最大工厂还是定义了创建什么水果
(待续)
原文:https://www.cnblogs.com/cat520/p/13138460.html