ファクトリメソッドパターン
最初に要件を見てみましょう。顧客がピザを注文すると、ヘナンチーズピザ、ヘナンペッパーピザ、ロンドンチーズピザ、ロンドンペッパーピザなど、さまざまなフレーバーのピザを注文できます。
アイデア
アイデア1:単純なファクトリパターンを使用して、HNPizzaSimpleFactory、LDPizzaSimpleFactoryなどのさまざまな単純なファクトリクラスを作成します
。現在のケースからも可能ですが、プロジェクトの規模、および保守性とスケーラビリティを考慮すると、ソフトウェア特に良くない
アイデア2:ファクトリメソッドパターンを使用する
ファクトリメソッドパターンの概要
ファクトリメソッドパターンデザインスキーム:ピザプロジェクトのインスタンス化関数を抽象メソッドに抽象化し、さまざまなテイストオーダーサブクラスに実装します。
ファクトリメソッドパターン:オブジェクトを作成するための抽象メソッドを定義し、サブクラスがインスタンス化されるクラスを決定します。ファクトリメソッドパターンは、オブジェクトのインスタンス化をサブクラスに延期します。
クラス図
当社の簡単な工場モデルは、工場内で直接オブジェクトのインスタンスを作成することです、とファクトリメソッドモデルは彼のサブクラスにオブジェクトを作成する権限を与えることです、HNOrderPizz(河南省ピザ)とLNOrderPizza(ロンドンピザ)
コード
ピザエンティティ
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/21 20:06
* @Description TODO
* @pojectname 披萨抽象类 设置为抽象类
*/
public abstract class Pizza {
//披萨名字
protected String name;
//抽象方法 准备原材料 不同的披萨,原材料是不同的
//因此做成抽象方法
public abstract void prepare();
//其他方法,我们人为流程是差不多的所以就是普通方法
public void bake(){
System.out.println(name+"baking;");
}
public void cut(){
System.out.println(name+"cutting;");
}
public void box(){
System.out.println(name+"boxing");
}
public void setName(String name) {
this.name = name;
}
}
河南ピザとロンドンピザの4つのサブカテゴリ
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/25 20:47
* @Description TODO
* @pojectname 河南奶酪代码
*/
public class HNCheesePizza extends Pizza{
@Override
public void prepare() {
setName("河南的奶酪披萨");
System.out.println("给河南奶酪披萨准备原材料");
}
}
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/25 20:49
* @Description TODO
* @pojectname 河南胡椒代码
*/
public class HNPepperPizza extends Pizza {
@Override
public void prepare() {
setName("河南的胡椒披萨");
System.out.println("给河南胡椒披萨准备原材料");
}
}
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/25 20:47
* @Description TODO
* @pojectname 伦敦奶酪代码
*/
public class LDCheesePizza extends Pizza{
@Override
public void prepare() {
setName("伦敦的奶酪披萨");
System.out.println("给伦敦奶酪披萨准备原材料");
}
}
伦敦胡椒披萨也如此
OrderPizza注文コード
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/21 20:14
* @Description TODO
* @pojectname 订购披萨代码
*/
public abstract class OrderPizza {
//定义一个抽象方法createPizza,让各个工厂子类自己实现
abstract Pizza createPizza(String orderType);
//构造器
public OrderPizza(){
Pizza pizza = null;
String orderType ;//orderType用户输入pizza类型
do {
orderType = getType();//获取用户订购的pizza类型
System.out.println(orderType);
pizza = createPizza(orderType);//抽象方法,实际上又工厂子类完成
//输出制作pizza信息
//订购成功
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}while(true);
}
//获取客户订购的披萨种类
private String getType(){
try {
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza 种类:");
String str = strin.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
OrderPizzaの2つのサブクラス
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/25 20:56
* @Description TODO
* @pojectname 河南披萨订单代码
*/
public class HNOrderPizza extends OrderPizza {
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if (orderType.equals("cheese")) {
pizza = new HNCheesePizza();
}else if (orderType.equals("pepper")){
pizza = new HNPepperPizza();
}
return pizza;
}
}
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/25 20:56
* @Description TODO
* @pojectname 伦敦披萨代码
*/
public class LDOrderPizza extends OrderPizza {
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if (orderType.equals("cheese")) {
pizza = new LDCheesePizza();
}else if (orderType.equals("pepper")){
pizza = new LDPepperPizza();
}
return pizza;
}
}
public class PizzaStore {
public static void main(String[] args) {
//创建河南口味的各种方法
new HNOrderPizza();
}
}
根据我们new的种类,我们就能得到不同的结果
input pizza 种类:
cheese
cheese
给河南奶酪披萨准备原材料
河南的奶酪披萨baking;
河南的奶酪披萨cutting;
河南的奶酪披萨boxing
input pizza 种类:
pepper
那我们要是 new LDOrderPizza();
那么输出的都是有关伦敦披萨的口味
総括する
。当社での、再びまとめてみましょう簡単な工場モデル、私たちのアイデアがあるために、直接私たちのOrderPizza順序クラスを聞かせて、ピザの新しい異なる味に異なるorderTypeの好みに応じて、そして私たちの方法の工場のモデルは、このようなものです:私たちのメソッドの工場モデルでは、当社OrderPizza順序クラスがされて書かれた抽象クラスでcreatePiiza()抽象メソッド。この抽象メソッドをするために使用されたピザのインスタンスオブジェクトを作成しますが、それは抽象メソッドである私たちの河南省のピザの注文とロンドンのピザの注文をしなければならないので、メインクラスを継承しますOrderPizza。つまり、インスタンスオブジェクトを作成するタスクをさまざまなサブクラスに分散します。サブクラスは元々異なり、自然にさまざまな場所のピザを作成できます。次に、サブクラスがさまざまな場所でさまざまなフレーバーのピザを作成した後、 OrderPizzaメインクラスに戻ると、メインクラスは対応する情報を出力します