工場モード
最初に特定の要件を見てみましょう
ピザプロジェクトを見てください:ピザの種類の拡大とメンテナンスを容易にするために
1)ピザには多くの種類があります(GreekPizz(ギリシャ語)、CheesePizz(チーズ)など)
2)ピザはprepare(準備材料)、焼く(焼く)焼く)、切る(切る)、箱(詰める)
3)ピザ屋の注文機能を完了します。
伝統的な方法は何ですか
コード
ピザ抽象クラス
/**
* @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;
}
}
2種類のピザ
public class CheesePizza extends Pizza {
@Override
public void prepare() {
System.out.println("准备制作奶酪披萨的原材料");
}
}
public class GreekPizza extends Pizza {
@Override
public void prepare() {
System.out.println("给希腊披萨准备原材料");
}
}
注文開始クラス
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/21 20:14
* @Description TODO
* @pojectname 订购披萨代码
*/
public class OrderPizza {
//构造器
public OrderPizza() {
Pizza pizza = null;
String orderType;//订购披萨类型是什么
do {
orderType = getType();
if (orderType.equals("greek")){
pizza = new GreekPizza();
pizza.setName("希腊披萨");
}else if (orderType.equals("cheese")){
pizza = new CheesePizza();
pizza.setName("奶酪披萨");
}else {
break;
}
//输出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 "";
}
}
}
メインカテゴリー:ピザショップ
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/21 20:22
* @Description TODO
* @pojectname 披萨店客户端,发起订购的类(主类)
*/
public class PizzaStore {
public static void main(String[] args) {
OrderPizza orderPizza = new OrderPizza();
}
}
利点と問題
利点は、理解しやすく、操作しやすいことです。
欠点は、デザインパターンのocp原則に違反することです。つまり、拡張のために開いており、変更のために閉じています。つまり、クラスに新しい関数を追加するときは、コードを変更しないようにするか、コードの変更をできるだけ少なくしてください。
たとえば、この時点で新しいタイプのピザ(Pepper Pizza)を追加する場合は、次の変更を行う必要があります。
1.ペッパーピザを追加し、抽象的なピザクラスを継承します
public class PepperPizza extends Pizza {
@Override
public void prepare() {
System.out.println("给胡椒披萨准备原材料");
}
}
2.OrderPizzaにペッパーピザかどうかを判断するロジックを追加する必要があります
if (orderType.equals("greek")){
pizza = new GreekPizza();
pizza.setName("希腊披萨");
}else if (orderType.equals("cheese")){
pizza = new CheesePizza();
pizza.setName("奶酪披萨");
}else if (orderType.equals("pepper")){
pizza = new PepperPizza();
pizza.setName("胡椒披萨");
} else {
break;
}
多くの支店が参加しており、2、3、4、5、6があります... OrderPizzaはどうですか?すべてを変更する必要はありませんか?
改善する
分析:コードの変更は許容されますが、他の場所にピザを作成するコードもある場合は、それも変更する必要があることを意味し、ピザのコードを作成する場所が複数あることがよくあります。
**アイデア:**作成されたPizzaオブジェクトをクラスにカプセル化して、新しいPizzaタイプがある場合、クラスを変更するだけでよく、Pizzaオブジェクトを作成する他のコードを変更する必要はありません=== = >シンプルファクトリーモード
シンプルなファクトリパターン
基本的な紹介
静的ファクトリモード
1)単純ファクトリモデルは、ファクトリモデルの一種である作成モデルに属します。単純なファクトリパターンは、ファクトリオブジェクトが製品クラスのどのインスタンスを作成するかを決定するというものです。シンプルファクトリモードは、ファクトリモードファミリの中で最もシンプルで実用的なモードです。
2)単純なファクトリパターン:オブジェクトを作成するためのクラスを定義し、そしてこのクラスは、インスタンス化されたオブジェクトの挙動をカプセル化(コード)
3)ソフトウェア開発において、特定のタイプ、特定のタイプ、または特定のバッチのオブジェクトを作成するために多数のオブジェクトを使用する場合、ファクトリモデルが使用されます。
コード
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/21 20:43
* @Description TODO
* @pojectname 简单工厂用来管理Pizza的生产
*/
public class SimpleFactory {
/**
* 根据我们的pizza类型,返回一个该类型的实例对象
* @param orderType pizza类型
* @return
*/
public Pizza createPizza(String orderType){
Pizza pizza = null;
System.out.println("使用简单工厂模式");
if (orderType.equals("greek")){
pizza = new GreekPizza();
pizza.setName("希腊披萨");
}else if (orderType.equals("cheese")){
pizza = new CheesePizza();
pizza.setName("奶酪披萨");
}else if (orderType.equals("pepper")){
pizza = new PepperPizza();
pizza.setName("胡椒披萨");
}
return pizza;
}
}
OrderPizzaの変更
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/21 20:14
* @Description TODO
* @pojectname 订购披萨代码
*/
public class OrderPizza {
//定义简单工厂对象
SimpleFactory simpleFactory;
Pizza pizza = null;
public void setSimpleFactory(SimpleFactory simpleFactory) {
String orderType = "";//orderType用户输入pizza类型
this.simpleFactory = simpleFactory;//设置一个简单工厂对象
do {
orderType = getType();//获取用户订购的pizza类型
pizza = this.simpleFactory.createPizza(orderType);
//输出制作pizza信息
if (pizza != null){
//订购成功
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}else {
System.out.println("预定失败,请检查是不是没有这个pizza类型");
break;
}
}while(true);
}
//构造器
public OrderPizza(SimpleFactory simpleFactory){
setSimpleFactory(simpleFactory);
}
//获取客户订购的披萨种类
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 "";
}
}
}
クライアントの変更
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/21 20:22
* @Description TODO
* @pojectname 披萨店客户端,发起订购的类(主类)
*/
public class PizzaStore {
public static void main(String[] args) {
//使用简单工厂模式订购
new OrderPizza(new SimpleFactory());
System.out.println("退出程序");
}
}
理解しましょう:まず、さまざまな種類のピザの新しいコードをOrderPizzaから単純なファクトリモデルに転送しました。これにより、将来ピザの種類を増やす必要がある場合でも、それほど多くのことを心配する必要がなくなります。 OrderPizzaは、ファクトリモデルに含まれている必要があります。論理的な判断を追加するだけで、このファクトリは、 OOPの考え方に沿った拡張機能です。
OrderPizzaでは、直接の友達の単純なファクトリオブジェクトが導入されています。この単純なファクトリオブジェクトは、Pizzaを生成します。OrderPizzaはこのオブジェクトを取得するだけでよく、自分で新しいオブジェクトに移動する必要はありません。変更に準拠しています。閉じる。
より便利なのは、createPizzaメソッドを単純なファクトリパターンで静的メソッドとして設定できることです。コードはどうなるのでしょうか。
単純なファクトリモードの変更は、createPizzaメソッドに静的な変更を追加することだけです。
OrderPizzaの変更
package com.wang.factory.pizza.order;
import com.wang.factory.pizza.Pizza;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @author 王庆华
* @version 1.0
* @date 2020/12/21 20:14
* @Description TODO
* @pojectname 订购披萨代码
*/
public class OrderPizza2 {
Pizza pizza = null;
String orderType = "";//orderType用户输入pizza类型
//构造器
public OrderPizza2(){
do {
orderType = getType();//获取用户订购的pizza类型
pizza = SimpleFactory.createPizza(orderType);
//输出制作pizza信息
if (pizza != null){
//订购成功
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}else {
System.out.println("预定失败,请检查是不是没有这个pizza类型");
break;
}
}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 "";
}
}
}
createPizzaが静的モードになっているため、単純なファクトリオブジェクトを渡す必要はなく、クラス名で直接呼び出すことができ、単純なファクトリオブジェクトを設定する必要もありません。
両者の違いは大きくなく、静的な方法でなければ、ニーズに応じて簡単に作成でき、ビジネスニーズによって効果に大きな違いはありません。