设计模式-2-抽象工厂方法

时间:2022-10-02 16:38:36

一、概述

1-抽象工厂
提供一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体的实现类
2-设计原则
(1)开闭(2)多用组合,少继承
抽象工厂和工厂方法的区别
(1)工厂通过继承解耦;抽象工厂通过组合解耦
(2)工厂用于创建一个抽象产品,具体的工厂用于创建具体的产品;抽象工厂用于创建一个产品家族的抽象类型
3-使用场合
(1)创建产品家族

(2)提供一个产品库,并只想显示器接口而非实现

设计模式-2-抽象工厂方法


========抽象食物接口
package SheJiMoShiNaDianShi.AbstractFactory.model;

/**
* Created by hjw on 16/8/28.
* 食物辅助接口,用于实现共性,如打印信息
*/
public interface IFood {
public void printMessage();
}



========抽象食物

package SheJiMoShiNaDianShi.AbstractFactory.model;

/**
* Created by hjw on 16/8/28.
* 抽象的食物对象
*/
public abstract class AbstractBaseFood {
//类别
protected String kind;
//数量
protected int num;

//单价
protected float price;

//总价
public float totalPrice() {
return this.num * this.price;
}
}

========抽象食物鸡翅
package SheJiMoShiNaDianShi.AbstractFactory.model;

/**
* Created by hjw on 16/8/28.
*/
public abstract class ChickenWings extends AbstractBaseFood implements IFood{
@Override
public void printMessage() {
System.out.println("----"+this.kind+"风味鸡翅,\t 单价:"+this.price + ", \t数量:"+this.num+
", \t总计:"+this.totalPrice());
}
}

========抽象食物汉堡
package SheJiMoShiNaDianShi.AbstractFactory.model;

/**
* Created by hjw on 16/8/28.
* 创建不同食物的抽象类
*/
public abstract class Hamburg extends AbstractBaseFood implements IFood{
@Override
public void printMessage() {
System.out.println("----"+this.kind+"风味汉堡,\t 单价:"+this.price + ", \t数量:"+this.num+
", \t总计:"+this.totalPrice());
}
}



========具体食物鸡翅
package SheJiMoShiNaDianShi.AbstractFactory.model.kfc;

import SheJiMoShiNaDianShi.AbstractFactory.model.ChickenWings;

/**
* Created by hjw on 16/8/28.
* 鸡翅实现类
*/
public class ChinaChickenWings extends ChickenWings {
/**
* 构造函数
* @param kind
* @param price
* @param num
*/
public ChinaChickenWings(String kind,float price,int num) {
this.kind = kind;
this.price = price;
this.num = num;
}

}



========具体食物汉堡
package SheJiMoShiNaDianShi.AbstractFactory.model.kfc;

import SheJiMoShiNaDianShi.AbstractFactory.model.Hamburg;

/**
* Created by hjw on 16/8/28.
* 创建具体的食物
*/
public class ChinaHamburg extends Hamburg {
/**
* 构造函数
* @param kind
* @param price
* @param num
*/
public ChinaHamburg(String kind,float price,int num) {
this.kind = kind;
this.price = price;
this.num = num;
}
}



========抽象工厂接口
package SheJiMoShiNaDianShi.AbstractFactory.itf;

import SheJiMoShiNaDianShi.AbstractFactory.model.ChickenWings;
import SheJiMoShiNaDianShi.AbstractFactory.model.Hamburg;

/**
* Created by hjw on 16/8/28.
* 抽象工厂接口
*/
public interface IKfcFactory {
public Hamburg creatHamburg(String kind,float price,int num);
public ChickenWings creatChichenWings(String kind,float price,int num);
}


========具体工厂
package SheJiMoShiNaDianShi.AbstractFactory.itf;

import SheJiMoShiNaDianShi.AbstractFactory.model.ChickenWings;
import SheJiMoShiNaDianShi.AbstractFactory.model.Hamburg;
import SheJiMoShiNaDianShi.AbstractFactory.model.kfc.ChinaChickenWings;
import SheJiMoShiNaDianShi.AbstractFactory.model.kfc.ChinaHamburg;

/**
* Created by hjw on 16/8/28.
* 具体的工厂
*/
public class ChinaKfcFactory implements IKfcFactory {
@Override
public Hamburg creatHamburg(String kind, float price, int num) {
return new ChinaHamburg(kind, price, num);
}

@Override
public ChickenWings creatChichenWings(String kind, float price, int num) {
return new ChinaChickenWings(kind, price, num);
}
}


=====客户类-通过工厂暴露的方法实现具体对象的创建
package SheJiMoShiNaDianShi.AbstractFactory.custom;

import SheJiMoShiNaDianShi.AbstractFactory.itf.IKfcFactory;
import SheJiMoShiNaDianShi.AbstractFactory.model.ChickenWings;
import SheJiMoShiNaDianShi.AbstractFactory.model.Hamburg;

/**
* Created by hjw on 16/8/28.
* 客户类-通过工厂暴露的方法实现具体对象的创建
*/
public class Custom {
IKfcFactory iKfcFactory;

public Custom(IKfcFactory iKfcFactory) {
this.iKfcFactory = iKfcFactory;
}

public float orderHamburg(String kind, float price, int num){
Hamburg hamburg = iKfcFactory.creatHamburg(kind, price, num);
hamburg.printMessage();
return hamburg.totalPrice();
}

public float orderChickenWings(String kind, float price, int num){
ChickenWings chickenWings = iKfcFactory.creatChichenWings(kind, price, num);
chickenWings.printMessage();
return chickenWings.totalPrice();
}
}

=====app
package SheJiMoShiNaDianShi.AbstractFactory;

import SheJiMoShiNaDianShi.AbstractFactory.custom.Custom;
import SheJiMoShiNaDianShi.AbstractFactory.itf.ChinaKfcFactory;
import SheJiMoShiNaDianShi.AbstractFactory.itf.IKfcFactory;

/**
* Created by hjw on 16/8/28.
*/
public class MainApp {
public static void main(String[] args) {
IKfcFactory iKfcFactory = new ChinaKfcFactory();

Custom custom = new Custom(iKfcFactory);

float hamburgMoney = custom.orderHamburg("麻辣", 1.2f, 2);
float chichenWingsMoney = custom.orderChickenWings("奥尔良", 2, 4);
System.out.println("总计: " + (hamburgMoney + chichenWingsMoney));
}
}