一. 定义
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
二. 模式起源
三. 设计原则
四. UML图
五. 代码
5.1 水果父类
package model.factory;
/**
* 水果父类
*/
public abstract class Fruit {
/**
* 展示是哪种水果
*/
public abstract void show();
}
5.2 A工厂生产的苹果类
package model.factory;
/**
* A工厂生产的苹果类
*/
public class AApple extends Fruit {
@Override
public void show() {
System.out.println("I am an apple made in AFruitFactory");
}
}
5.3 A工厂生产的香蕉类
package model.factory;
/**
* A工厂生产的香蕉类
*/
public class ABanana extends Fruit {
@Override
public void show() {
System.out.println("I am a banana made in AFruitFactory");
}
}
5.4 A工厂生产的橘子类
package model.factory;
/**
* A工厂生产的橘子类
*/
public class AOrange extends Fruit {
@Override
public void show() {
System.out.println("I am an orange made in AFruitFactory");
}
}
5.5 B工厂生产的苹果类
package model.factory;
/**
* B工厂生产的苹果类
*/
public class BApple extends Fruit {
@Override
public void show() {
System.out.println("I am an apple made in BFruitFactory");
}
}
5.6 B工厂生产的香蕉类
package model.factory;
/**
* B工厂生产的香蕉类
*/
public class BBanana extends Fruit {
@Override
public void show() {
System.out.println("I am a banana made in BFruitFactory");
}
}
5.7 B工厂生产的橘子类
package model.factory;
/**
* B工厂生产的橘子类
*/
public class BOrange extends Fruit {
@Override
public void show() {
System.out.println("I am an orange made in BFruitFactory");
}
}
5.8 水果商店类
package model.factory;
/**
* 水果商店类
*/
public abstract class FruitStore {
/**
* 订购水果
* @param type 水果类型
* @return 水果
*/
public Fruit orderFruit(String type) {
// 此处交由子类作为工厂来生产水果,this: 只要父类为FruitStore的子类都可以
Fruit fruit = this.createFruit(type);
return fruit;
}
/**
* 生产水果
* @param type 水果类型
* @return 水果
*/
protected abstract Fruit createFruit(String type);
}
5.9 A水果工厂类
package model.factory;
/**
* A水果工厂类
*/
public class AFruitFactory extends FruitStore {
@Override
protected Fruit createFruit(String type) {
Fruit fruit = null;
if (type.equals("apple")) {
fruit = new AApple();
} else if (type.equals("banana")) {
fruit = new ABanana();
} else if (type.equals("orange")) {
fruit = new AOrange();
}
return fruit;
}
}
5.10 B水果工厂类
package model.factory;
/**
* B水果工厂类
*/
public class BFruitFactory extends FruitStore {
@Override
protected Fruit createFruit(String type) {
Fruit fruit = null;
if (type.equals("apple")) {
fruit = new BApple();
} else if (type.equals("banana")) {
fruit = new BBanana();
} else if (type.equals("orange")) {
fruit = new BOrange();
}
return fruit;
}
}
5.11 测试
package model.factory;
public class Main {
public static void main(String[] args) {
FruitStore aFruitFactory = new AFruitFactory();
FruitStore bFruitFactory = new BFruitFactory();
Fruit fruit = aFruitFactory.createFruit("apple");
fruit.show();
fruit = bFruitFactory.createFruit("apple");
fruit.show();
}
}
5.12 结果
I am an apple made in AFruitFactory
I am an apple made in BFruitFactory
六. 感悟
皮一下: Head First设计模式中文版 P122页 印刷错误 : 但由于Pizza对象是抽象的, 中应该为PizzaStore而非Pizza. 截图如下:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/17809.html