软件设计模式--建造者模式

第一次写博客有点小陌生,以后会慢慢熟悉的,大家多包涵哈~~~

这次讲以下几种模式哦😄

  1. 简单工厂模式 
  2. 工厂方法模式
  3. 抽象工厂模式
  4. 建造者模式

为什么要有创建型模式?
所有的创建型模式都有两个永恒的主旋律:第一,它们都将系统使用哪些具体类的信息封装起来;第二,它们隐藏了这些类的实例是如何被创建和组织的。外界对于这些对象只知道它们共同的接口,而不清楚其具体的实现细节。正因如此,创建型模式在创建什么(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());
}
}
}

* 模式效果与应用

结束充忙,下次跟大家补充原型模式和单例模式,见谅啦~~~

衍生:钩子方法
**原型模式**
**单例模式**
#设计模式

posted @ 2019-03-26 21:27  Cliffia  阅读(143)  评论(0)    收藏  举报