软件设计模式--建造者模式
第一次写博客有点小陌生,以后会慢慢熟悉的,大家多包涵哈~~~
这次讲以下几种模式哦😄
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
- 建造者模式
为什么要有创建型模式?
所有的创建型模式都有两个永恒的主旋律:第一,它们都将系统使用哪些具体类的信息封装起来;第二,它们隐藏了这些类的实例是如何被创建和组织的。外界对于这些对象只知道它们共同的接口,而不清楚其具体的实现细节。正因如此,创建型模式在创建什么(what),由谁(who)来创建,以及何时(when)创建这些方面,都为软件设计者提供了尽可能大的灵活性。
简单工厂模式:传入一个参数,根据参数不同,调用if/switch语句
例子:
代码演示
public abstract class Product{ public abstract void use(); } public class CreateProductA{ public void use(){ } } public class CreateProductB{ public void use(){ } } public class Factory{ public static Product createProduct(String type){ if(agr=='A'){ return new ConcreateProductA(); } if(agr=='B'){ return new ConcreateProductB(); } } }
工厂方法模式
完全符合开闭原则,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
例子:电视机工厂
/// 抽象工厂 public interface TVFactory { TV produceTV();//产品对象的公共接口 } /// 抽象产品 public ininterface class TV { public void play(); } //海尔电视机 public class HaierTV implements TV { public void play() { System.out.println("我是海尔电视机"); } } //海信电视机 public class HisenseTV implements TV { public void play() { System.out.println("我是海信电视机"); } } /// 海尔电视机工厂 public class HaierTVFactory implements TVFactory { public TV produceTV() { return new HaierTV(); } } /// 海信电视机工厂 public class HisenseTVFactory implements TVFactory { public TV produceTV() { return new HisenseTV(); } } class Client { static void Main(string[] args) { TVFactory factory = new HaierTV(); //控制具体要哪个产品 TV tv = factory.produceTV(); tv.play() } }
抽象工厂模式
- 模式动机与定义:
产品等级结构->产品的继承结构,如抽象类是电视机,子类有海尔电视机,海信电视机,TCL电视机;
产品族-> 产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,例如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。
//抽象工厂类EFactory public interface EFactory{ public Television produceTelevision(); public AirCondition produceAirCondition(); } //具体工厂类 HaierFactory public class HaierFactory implements EFactory{ public Television produceTelevision(){ return new HaierTelevision; } public AirCondition produceAirCondition(){ return new HaierAirConditioner; } } //具体工厂类 TCLFactory public class TCLFactory implements EFactory{ public Television produceTelevision(){ return new TCLTelevision; } public AirCondition produceAirCondition(){ return new TCLAirConditioner; } } //抽象产品类Televison public interface Television{ void play(); } //具体产品类->海尔电视机 public class HaierTelevision implements Television{ void play(){ System.out.println("海尔电视机"); } } //具体产品类->TCL电视机 public class TCLTelevision implements Television{ void play(){ System.out.println("TCL电视机"); } } //抽象产品类AirConditioner public interface AirConditioner{ void changeTemperature(); } //具体产品类->海尔空调 public class HaierAirConditioner implements AirConditioner{ void play(){ System.out.println("海尔空调"); } } //具体产品类->TCL空调 public class TCLAirConditioner implements AirConditioner{ void play(){ System.out.println("TCL空调"); } } //测试 xml文件 <?xml version="1.0"?> <config> <className>HierFactory</className> </config> //客户端Client public class Client{ public static void main(String args[]){ try{ EFactory factory; Television tv; AirCondition ac; factory = (EFactory)XMLUtil.getBean(); tv = factory. produceTelevision (); tv.play(); ac = factory. produceAirCondition(); ac.changeTemperature(); } catch(Exception e){ System.out.println(e.getMessage()); } } }
- 模式效果与应用
建造者模式
- 模式动机与定义:创建一个包含多个组成部分的复杂对象,可以返回一个完整的产品给用户,用户不需要知道内部的具体构建细节
- 模式结构与分析
-
- 模式实例与解析
以KFC套餐为例,产品类Meal,MealBuilder抽象类建造者,具体建造者subMealBuilderA套餐 , 具体建造者subMealBuilderB套餐,KFCWaiter指挥者类,服务员
```
//产品类 Meal public class Meal{ private String food; private String drink; public void setFood(String food){ this.food = food; } public void setDrink(String drink){ this.drink = drink; } public String getFood(){ return (this.food); } public String getDrink(){ return (this.drink); } } //套餐建造者类 public adstract class MealBuilder{ protected Meal meal = new Meal(); public abstract void bulidFood(); public abstract void buildDrink(); public Meal getMeal(){ return meal; } } //具体建造者类SubMealBuilderA public class SubMealBuilderA extends MealBuilder{ public void buildFood(){ meal.setFood("一个鸡腿堡"); } public void buildDrink(){ meal.setDrink("一杯可乐"); } } //具体建造者类SubMealBuilderB public class SubMealBuilderB extends MealBuilder{ public void buildFood(){ meal.setFood("一个鸡肉卷"); } public void buildDrink(){ meal.setDrink("一杯果汁"); } } 指挥者类KFCWaiter public class KFCWaiter{ private MealBuilder mb; public void setMealBuilder(MealBuilder mb){ this.mb = mb; } public Meal construct(){ mb.buildFood(); mb.buildDrink(); return mb; } } //测试 xml文件 <?xml version="1.0"?> <config> <className>SubMealBuilderA</className> </config> //客户端Client public class Client{ public static void main(String args[]){ try{ //动态确定套餐种类 MealBuilder mb = (MealBuilder)XMLUtil.getBean(); //指挥者时服务员 KFCWaiter waiter = new KFCWaiter(); waiter.setMealBuilder(mb); Meal meal = waiter.construct(); } catch(Exception e){ System.out.println(e.getMessage()); } } }
* 模式效果与应用
结束充忙,下次跟大家补充原型模式和单例模式,见谅啦~~~
衍生:钩子方法
**原型模式**
**单例模式**
#设计模式