日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

一文必懂-工厂模式

發(fā)布時(shí)間:2024/3/12 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一文必懂-工厂模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

工廠模式

  • 工廠模式
    • 傳統(tǒng)方式創(chuàng)建一類(lèi)對(duì)象
      • 優(yōu)缺點(diǎn)
    • 簡(jiǎn)單工廠模式
    • 工廠方法模式
      • 應(yīng)用場(chǎng)景與優(yōu)點(diǎn)
    • 抽象方法模式
      • 應(yīng)用場(chǎng)景
      • 優(yōu)點(diǎn)
      • JDK源碼中的應(yīng)用:
      • 工廠方法與抽象工廠的區(qū)別

今天也是干的一天

工廠模式

工廠模式分為簡(jiǎn)單工廠、工廠方法與抽象工廠模式;

傳統(tǒng)方式創(chuàng)建一類(lèi)對(duì)象

Pizza.java

package com.yxj.factory.simplefactory.pizzastore.pizza;//將Pizza 類(lèi)做成抽象 public abstract class Pizza {protected String name; //名字//準(zhǔn)備原材料, 不同的披薩不一樣,因此,我們做成抽象方法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;} }

CheesePizza.java

package com.yxj.factory.simplefactory.pizzastore.pizza;public class CheesePizza extends Pizza {@Overridepublic void prepare() {// TODO Auto-generated method stubSystem.out.println(" 給制作奶酪披薩 準(zhǔn)備原材料 ");}}

GreekPizza.java

package com.yxj.factory.simplefactory.pizzastore.pizza;public class GreekPizza extends Pizza {@Overridepublic void prepare() {// TODO Auto-generated method stubSystem.out.println(" 給希臘披薩 準(zhǔn)備原材料 ");}}

OrderPizza.java

public class OrderPizza {//構(gòu)造器public OrderPizza() {Pizza pizza = null;String orderType; // 訂購(gòu)披薩的類(lèi)型do {orderType = getType();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;}//輸出pizza 制作過(guò)程pizza.prepare();pizza.bake();pizza.cut();pizza.box();} while (true);}// 寫(xiě)一個(gè)方法,可以獲取客戶希望訂購(gòu)的披薩種類(lèi)private String getType() {try {BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));System.out.println("input pizza 種類(lèi):");String str = strin.readLine();return str;} catch (IOException e) {e.printStackTrace();return "";}}}

PepperPizza.java

package com.yxj.factory.simplefactory.pizzastore.pizza;public class PepperPizza extends Pizza {@Overridepublic void prepare() {// TODO Auto-generated method stubSystem.out.println(" 給胡椒披薩準(zhǔn)備原材料 ");}}

PizzaStore.java

package com.yxj.factory.simplefactory.pizzastore.order;//相當(dāng)于一個(gè)客戶端,發(fā)出訂購(gòu) public class PizzaStore {public static void main(String[] args) {// TODO Auto-generated method stubnew OrderPizza();}}

優(yōu)缺點(diǎn)

  • 簡(jiǎn)單、容易理解
  • 違反了OCP原則,即對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。即當(dāng)我們給類(lèi)增加新功能的時(shí)候,盡量不修改已經(jīng)寫(xiě)好的代碼,或者盡可能少修改代碼。
  • 比如我們這時(shí)要新增加一個(gè)Pizza的種類(lèi)(CheesePizza披薩),我們需要做如下修改.
//新增 寫(xiě) public class CheesePizza extends Pizza { @Override public void prepare() { // TODO Auto-generated method stub setName("奶酪pizza"); System.out.println(name + " preparing;"); }} //增加一段代碼 OrderPizza.java //寫(xiě) if (ordertype.equals("greek")) { pizza = new GreekPizza(); } else if (ordertype.equals("pepper")) { pizza = new PepperPizza(); } else if (ordertype.equals("cheese")) { pizza = new CheesePizza(); } else { break; }}
  • 也許有人會(huì)說(shuō),不就一個(gè)地方修改了代碼嗎?但是在工作中,可能在其他的地方也有創(chuàng)建Pizza代碼,意味著其他的地方也要修改,而創(chuàng)建Pizza代碼的地方,有很多處的情況下,就麻煩了。
  • 思路:把創(chuàng)建Pizza對(duì)象封裝到一個(gè)類(lèi)中,這樣我們有新的Pizza種類(lèi)時(shí),只需要修改該
    類(lèi)就可,其它有創(chuàng)建到Pizza對(duì)象的代碼就不需要修改了.-> 簡(jiǎn)單工廠模式

簡(jiǎn)單工廠模式

簡(jiǎn)單工廠模式是屬于創(chuàng)建型模式、是工廠模式的一種。簡(jiǎn)單工廠模式就是由一個(gè)對(duì)象(對(duì)應(yīng)一個(gè)SimpleFactory類(lèi))決定創(chuàng)建出哪一產(chǎn)品類(lèi)的實(shí)例。

核心類(lèi)SimpleFactory

public class SimpleFactory {//簡(jiǎn)單工廠模式 也叫 靜態(tài)工廠模式 public static Pizza createPizza2(String orderType) {Pizza pizza = null;System.out.println("使用簡(jiǎn)單工廠模式2");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;}}

OrderPizza2.java

public class OrderPizza2 {Pizza pizza = null;String orderType = "";// 構(gòu)造器public OrderPizza2() {do {orderType = getType();pizza = SimpleFactory.createPizza2(orderType);// 輸出pizzaif (pizza != null) { // 訂購(gòu)成功pizza.prepare();pizza.bake();pizza.cut();pizza.box();} else {System.out.println(" 訂購(gòu)披薩失敗 ");break;}} while (true);}// 寫(xiě)一個(gè)方法,可以獲取客戶希望訂購(gòu)的披薩種類(lèi)private String getType() {try {BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));System.out.println("input pizza 種類(lèi):");String str = strin.readLine();return str;} catch (IOException e) {e.printStackTrace();return "";}} }
  • 核心就是SimpleFactory的實(shí)現(xiàn),使用該類(lèi)負(fù)責(zé)實(shí)例的創(chuàng)建,符合OCP開(kāi)閉原則;

工廠方法模式

定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi)。Factory Method使得一個(gè)類(lèi)的實(shí)例化延遲到子類(lèi);

package com.tuling.designpattern.factorymethod;/*** @author 玄霄* @Slogan 致敬大師,致敬未來(lái)的你*/ public class FactoryMethodTest {public static void main(String[] args) {Application application= new ConcreteProductB();Product product=application.getObject();product.method1();} }interface Product{void method1(); }class ProductA implements Product{@Overridepublic void method1() {System.out.println( "ProductA.method1 executed." );} }class ProductB implements Product{@Overridepublic void method1() {System.out.println( "ProductB.method1 executed." );} }// 簡(jiǎn)單工廠 class SimpleFactory{public static Product createProduct(String type){if ("A".equals( type )){return new ProductA();}return null;} }// 變化 , 共同點(diǎn) abstract class Application {// 工廠方法public abstract Product createProduct();public Product getObject() {Product product=createProduct();// ......這是公共不變的部分代碼return product;} }class ConcreteProductA extends Application{@Overridepublic Product createProduct() {ProductA productA=new ProductA();return productA;} }class ConcreteProductB extends Application{@Overridepublic Product createProduct() {ProductB productB=new ProductB();return productB;} }

應(yīng)用場(chǎng)景與優(yōu)點(diǎn)

  • 當(dāng)你不知道改使用對(duì)象的確切類(lèi)型的時(shí)候
  • 當(dāng)你希望為庫(kù)或框架提供擴(kuò)展其內(nèi)部組件的方法時(shí)

優(yōu)點(diǎn):

  • 將具體產(chǎn)品和創(chuàng)建者解耦
  • 符合單一職責(zé)原則
  • 符合開(kāi)閉原則

抽象方法模式

提供一個(gè)創(chuàng)建一系列相關(guān)或互相依賴對(duì)象的接口,而無(wú)需指定他們的具體的類(lèi)

  • AbstractProductA:創(chuàng)建A類(lèi)產(chǎn)品所實(shí)現(xiàn)的接口,該接口包含了A類(lèi)產(chǎn)品中共有的方法;
interface IConnection{void connection(); }
  • ProductA1,ProductA2:A類(lèi)的具體產(chǎn)品;
class MyConnection implements IConnection{@Overridepublic void connection() {System.out.println("mysql: connect.");} } class OracleConnection implements IConnection{@Overridepublic void connection() {System.out.println("oracle:connect.");} }
  • AbstractProductB:創(chuàng)建B類(lèi)產(chǎn)品所實(shí)現(xiàn)的接口,該接口包含了B類(lèi)產(chǎn)品中共有的方法;
interface ICommand{void command(); }
  • ProductB1,ProductB2:B類(lèi)的具體產(chǎn)品
class MyCommand implements ICommand{@Overridepublic void command() {System.out.println("mysql: command.");} } class OracleCommand implements ICommand{@Overridepublic void command() {System.out.println("oracle:command.;");} }
  • AbstracyFactory:包含了創(chuàng)建的A類(lèi)、B類(lèi)產(chǎn)品的接口方法;
interface IDBComponent{IConnection getConnection();ICommand getCommand(); }
  • ConcreteFactory1: 創(chuàng)建 “1”系列的產(chǎn)品,即ProductA1,ProductB1;
//“1”在這里值的是MySQL class MysqlDbComponent implements IDBComponent{@Overridepublic IConnection getConnection() {return new MyConnection();}@Overridepublic ICommand getCommand() {return new MyCommand();} }
  • ConcreteFactory2: 創(chuàng)建 “2”系列的產(chǎn)品,即ProductA2,ProductB2;
//“2”在這里值的是Oracle系列 class OralceDbComponent implements IDBComponent{@Overridepublic IConnection getConnection() {return new OracleConnection();}@Overridepublic ICommand getCommand() {return new OracleCommand();} }

應(yīng)用場(chǎng)景

  • 程序需要處理不同系列的相關(guān)產(chǎn)品,但是您不希望它依賴于這些產(chǎn)品的具體類(lèi)時(shí)
  • 可以使用抽象工廠

優(yōu)點(diǎn)

  • 可以確信你從工廠得到的產(chǎn)品彼此是兼容的。
  • 可以避免具體產(chǎn)品和客戶端代碼之間的緊密耦合。
  • 符合單一職責(zé)原則
  • 符合開(kāi)閉原則
  • JDK源碼中的應(yīng)用:

    java.sql.Connection java.sql.Driver

    工廠方法與抽象工廠的區(qū)別

    當(dāng)抽象工廠接口方法只有一個(gè)時(shí),就變成了工廠方法模式;

    千軍萬(wàn)馬一將在,探囊取物有何難

    總結(jié)

    以上是生活随笔為你收集整理的一文必懂-工厂模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。