ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

简单工厂模式,工厂方法模式,抽象工厂模式

简单工厂模式,工厂方法模式,抽象工厂模式 常见设计模式-创建型模式-简单工厂模式工厂方法模式抽象工厂模式文章目录常见设计模式-创建型模式-简单工厂模式工厂方法模式抽象工厂模式**简单工厂模式****工厂方法模式****抽象工厂模式**总结简单工厂模式简单工厂模式不是设计模式更像是一种编程习惯举一个例子我们来感受一下简单工厂简单工厂抽象父类CoffeepublicabstractclassCoffee{publicabstractStringgetName();publicvoidaddSuger(){System.out.println(添加糖);}publicvoidaddMilk(){System.out.println(添加牛奶);}}Coffee子类AmericanCoffeepublicclassAmericanCoffeeextendsCoffee{OverridepublicStringgetName(){return美式咖啡;}}Coffee子类LatteCoffeepublicclassLatteCoffeeextendsCoffee{OverridepublicStringgetName(){return拿铁咖啡;}}咖啡店CoffeeStore具有点咖啡功能创建简单工厂对象生产咖啡使咖啡店和咖啡解耦publicclassCoffeeStore{publicCoffeeOrderCoffee(Stringtype){SimpleCoffeeFactorysimpleCoffeeFactorynewSimpleCoffeeFactory();CoffeecoffeesimpleCoffeeFactory.createCoffee(type);coffee.addMilk();coffee.addSuger();returncoffee;}}简单工厂这里没有对应咖啡就抛异常publicclassSimpleCoffeeFactory{publicCoffeecreateCoffee(Stringtype){Coffeecoffeenull;if(AmericanCoffee.equals(type)){coffeenewAmericanCoffee();}elseif(LatteCoffee.equals(type)){coffeenewLatteCoffee();}else{thrownewRuntimeException(没有这个咖啡);}returncoffee;}}运行publicclassClient{publicstaticvoidmain(String[]args){CoffeeStorecoffeeStorenewCoffeeStore();CoffeecoffeecoffeeStore.OrderCoffee(LatteCoffee);System.out.println(coffee.getName());}}静态工厂将简单工厂的功能生产定义为静态方法publicclassSimpleCoffeeFactory{publicstaticCoffeecreateCoffee(Stringtype){Coffeecoffeenull;if(AmericanCoffee.equals(type)){coffeenewAmericanCoffee();}elseif(LatteCoffee.equals(type)){coffeenewLatteCoffee();}else{thrownewRuntimeException(没有这个咖啡);}returncoffee;}}Coffee直接调用简单工厂的静态方法publicclassCoffeeStore{publicCoffeeOrderCoffee(Stringtype){CoffeecoffeeSimpleCoffeeFactory.createCoffee(type);coffee.addMilk();coffee.addSuger();returncoffee;}}简单工厂使咖啡店和咖啡解耦咖啡店不必自己生产咖啡使用简单工厂的功能实现即可若咖啡店要自己生产咖啡每有一种新咖啡就必须修改咖啡店的源代码这样违背了开闭原则这是我们不想要的但是简单工厂和咖啡又产生了新的耦合后续有新的咖啡子类需要更改简单工厂里的代码也违背了开闭原则。开闭原则对扩展开放对修改关闭。工厂方法模式工厂方法模式完全遵循开闭原则定义一个工厂父类接口将产品实例化延迟到子类工厂中子类工厂继承父类工厂具体产品由具体产品对应子类工厂生产若有新产品只需添加对应子类工厂这样不必修改源代码只需扩展代码符合开闭原则Coffee类,AmericanCoffee类,Latte类不变先创建父类工厂接口publicinterfaceCoffeeFactory{CoffeecreateCoffee();}再创建子类工厂AmericanCoffeeFactorypublicclassAmericanCoffeeFactoryimplementsCoffeeFactory{OverridepublicCoffeecreateCoffee(){returnnewAmericanCoffee();}}LatteCoffeeFactorypublicclassLatteCoffeeFactoryimplementsCoffeeFactory{OverridepublicCoffeecreateCoffee(){returnnewLatteCoffee();}}CoffeeStore利用多态publicclassCoffeeStore{CoffeeFactoryfactorynull;publicCoffeeStore(CoffeeFactoryfactory){this.factoryfactory;}publicCoffeeOrderCoffee(){Coffeecoffeefactory.createCoffee();coffee.addSuger();coffee.addMilk();returncoffee;}}运行publicclassClient{publicstaticvoidmain(String[]args){AmericanCoffeeFactoryamericanCoffeeFactorynewAmericanCoffeeFactory();CoffeeStorecoffeeStorenewCoffeeStore(americanCoffeeFactory);CoffeecoffeecoffeeStore.OrderCoffee();System.out.println(coffee.getName());}}工厂方法模式有新的咖啡只需要创建对应咖啡工厂继承工厂父类让子类工厂实例化对象这样不需要修改原本代码就可以添加产品符合开闭原则但每增加新的产品都需要增加一个具体产品类和一个对应具体工厂增加了系统复杂度抽象工厂模式首先了解一下产品族和产品级的概念例如麦当当既有麦当当汉堡也有麦当当薯条肯基基既有肯基基汉堡也肯基基薯条其中麦当当的产品麦当当的汉堡和薯条属于同一产品族而麦当当的汉堡和肯基基的汉堡属于同一产品级工厂方法模式只生产同一级产品而抽象工厂模式可以生产多个等级的产品。这里以麦当当和肯基基生产快餐为例汉堡薯条饮品不管哪家店它们卖的东西都得符合平台标准//抽象产品 汉堡interfaceHamburger{voideat();}//抽象产品 薯条interfaceChips{voideat();}//抽象产品 饮品interfaceCola{voiddrink();}麦当当生产麦当当巨无霸、麦当当薯条、麦当当冰可乐classMddHamburgerimplementsHamburger{publicvoideat(){System.out.println(吃麦当当巨无霸);}}classMddChipsimplementsChips{publicvoideat(){System.out.println(吃麦当当薯条);}}classMddColaimplementsCola{publicvoiddrink(){System.out.println(喝麦当当冰可乐);}}肯基基生产肯基基香辣鸡腿堡、肯基基薯条、肯基基冰可乐classKjjHamburgerimplementsHamburger{publicvoideat(){System.out.println(吃肯基基香辣鸡腿堡);}}classKjjChipsimplementsChips{publicvoideat(){System.out.println(吃肯基基薯条);}}classKjjColaimplementsCola{publicvoiddrink(){System.out.println(喝肯基基冰可乐);}}平台规定凡是入驻的商家必须能提供一整套汉堡薯条饮品//抽象工厂interfaceFactory{HamburgercreateHamburger();//提供汉堡ChipscreateChips();//提供薯条ColacreateCola();//提供饮品}麦当当工厂体现了多态classMddFactoryimplementsFactory{publicHamburgercreateHamburger(){returnnewMddHamburger();}publicChipscreateChips(){returnnewMddChips();}publicColacreateCola(){returnnewMddCola();}}肯基基工厂体现了多态classKjjFactoryimplementsFactory{publicHamburgercreateHamburger(){returnnewKjjHamburger();}publicChipscreateChips(){returnnewKjjChips();}publicColacreateCola(){returnnewKjjCola();}}顾客点单main方法是程序主入口publicclassCustomer{//声明工厂顾客点餐时再选择具体工厂privateFactoryfactory;//利用构造方法注入具体工厂//进店扫码后系统会注入了对应的工厂麦当当或肯基基publicCustomer(Factoryfactory){this.factoryfactory;}publicvoidorderFan(){//不管你在哪家店点餐流程都是一模一样的//生产套餐中...Hamburgerhamburgerfactory.createHamburger();Chipschipsfactory.createChips();Colacolafactory.createCola();System.out.println(您的套餐已出餐);hamburger.eat();chips.eat();cola.drink();}//main方法程序主入口publicstaticvoidmain(String[]args){//顾客选择具体工厂FactoryfactorynewMddFactory();CustomercustomernewCustomer(factory);customer.orderFan();}}总结以上就是本期要讲的内容本文介绍了简单工厂模式工厂方法模式抽象工厂模式其他常见设计模式在本系列其他文章有兴趣可了解
返回列表