要求便于披萨种类的扩展,便于维护
/**
* @Classname Pizza
* @Description
* @Date 2021/9/28 14:12
* @Author Yzx
*/
public class Pizza {
private String name;
void prepare(){
System.out.println(name + " 披萨准备工作");
}
void bake(){
System.out.println(name + " 披萨烘烤工作");
}
void cut(){
System.out.println(name + " 披萨切割工作");
}
void box(){
System.out.println(name + " 披萨装盒工作");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* @Classname GreenPizza
* @Description
* @Date 2021/9/28 14:34
* @Author Yzx
*/
public class GreekPizza extends Pizza{
}
/**
* @Classname CheesePizza
* @Description
* @Date 2021/9/28 14:36
* @Author Yzx
*/
public class CheesePizza extends Pizza{
}
/**
1. @Classname OrderPizza
2. @Description
3. @Date 2021/9/28 14:37
4. @Author Yzx
*/
public class OrderPizza {
public static void main(String[] args) {
new OrderPizza();
}
public OrderPizza() {
Pizza pizza = null;
String orderType; // 订购披萨的类型
do {
orderType = getType();
if (orderType.equals("greek")) {
pizza = new GreekPizza();
pizza.setName(" 希腊披萨 ");
} else if (orderType.equals("cheese")) {
pizza = new CheesePizza();
pizza.setName(" 奶酪披萨 ");
} else {
break;
}
//输出 pizza 制作过程
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} while (true);
}
/**
* 获取客户希望订购的披萨种类
* @return 类型
*/
private String getType() {
try {
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza 种类:");
String str = strin.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
把创建pizza对象封装到一个类中, 当有新的种类时, 只需要修改这个类就可以, 其他创建pizza对象的代码就不需要修改, 也就是简单工厂模式
由一个工厂对象决定创建哪种产品累的实例, 是工厂模式中最简单使用的模式
/**
* @Classname Pizza
* @Description
* @Date 2021/9/28 14:12
* @Author Yzx
*/
public class Pizza {
private String name;
void prepare(){
System.out.println(name + " 披萨准备工作");
}
void bake(){
System.out.println(name + " 披萨烘烤工作");
}
void cut(){
System.out.println(name + " 披萨切割工作");
}
void box(){
System.out.println(name + " 披萨装盒工作");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* @Classname CheesePizza
* @Description
* @Date 2021/9/28 14:36
* @Author Yzx
*/
public class CheesePizza extends Pizza {
}
/**
* @Classname GreenPizza
* @Description
* @Date 2021/9/28 14:34
* @Author Yzx
*/
public class GreekPizza extends Pizza {
}
/**
* @Classname SimpleFactory
* @Description
* @Date 2021/9/28 15:29
* @Author Yzx
*/
public class SimpleFactory {
public static Pizza createPizza(String orderType) {
Pizza pizza = null;
System.out.println("使用简单工厂模式");
if (orderType.equals("greek")) {
pizza = new GreekPizza();
pizza.setName(" 希腊披萨 ");
} else if (orderType.equals("cheese")) {
pizza = new CheesePizza();
pizza.setName(" 奶酪披萨 ");
}
return pizza;
}
}
/**
* @Classname OrderPizza
* @Description
* @Date 2021/9/28 14:37
* @Author Yzx
*/
public class OrderPizza {
public static void main(String[] args) {
new OrderPizza();
}
public OrderPizza() {
//用户输入的
String orderType = "";
Pizza pizza = null;
do {
orderType = getType();
pizza = SimpleFactory.createPizza(orderType);
//输出 pizza
if (pizza != null) {
//订购成功
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} else {
System.out.println(" 订购披萨失败 ");
break;
}
} while (true);
}
/**
* 获取客户希望订购的披萨种类
*
* @return 类型
*/
private String getType() {
try {
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza 种类:");
String str = strin.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
客户在点披萨时, 可以点不同口味的披萨, 如北京的奶酪披萨, 北京的胡椒披萨或伦敦的奶酪披萨等
使用简单工厂模式, 创建不同的简单工厂类, 当有许多地市口味时, 软件的可维护性, 扩展性不好, 可以使用工厂方法模式
/**
* @Classname Pizza
* @Description
* @Date 2021/9/28 14:12
* @Author Yzx
*/
public class Pizza {
private String name;
void prepare(){
System.out.println(name + " 披萨准备工作");
}
void bake(){
System.out.println(name + " 披萨烘烤工作");
}
void cut(){
System.out.println(name + " 披萨切割工作");
}
void box(){
System.out.println(name + " 披萨装盒工作");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* @Classname BJCheessPizza
* @Description
* @Date 2021/9/28 17:20
* @Author Yzx
*/
public class BJCheesePizza extends Pizza{
public BJCheesePizza() {
this.setName("北京");
}
}
/**
* @Classname BJPepperPizza
* @Description
* @Date 2021/9/28 17:20
* @Author Yzx
*/
public class BJPepperPizza extends Pizza{
public BJPepperPizza() {
this.setName("北京");
}
}
/**
* @Classname BJOrderPizza
* @Description
* @Date 2021/9/28 17:23
* @Author Yzx
*/
public class BJOrderPizza extends OrderPizza {
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if (orderType.equals("cheese")) {
pizza = new BJCheesePizza();
} else if (orderType.equals("pepper")) {
pizza = new BJPepperPizza();
}
return pizza;
}
}
/**
* @Classname BJCheessPizza
* @Description
* @Date 2021/9/28 17:20
* @Author Yzx
*/
public class LDCheesePizza extends Pizza{
public LDCheesePizza() {
this.setName("伦敦");
}
}
/**
* @Classname BJPepperPizza
* @Description
* @Date 2021/9/28 17:20
* @Author Yzx
*/
public class LDPepperPizza extends Pizza{
public LDPepperPizza() {
this.setName("伦敦");
}
}
/**
* @Classname BJOrderPizza
* @Description
* @Date 2021/9/28 17:23
* @Author Yzx
*/
public class LDOrderPizza extends OrderPizza {
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if (orderType.equals("cheese")) {
pizza = new LDPepperPizza();
} else if (orderType.equals("pepper")) {
pizza = new LDPepperPizza();
}
return pizza;
}
}
/**
* @Classname OrderPizza
* @Description
* @Date 2021/9/28 14:37
* @Author Yzx
*/
public abstract class OrderPizza {
public static void main(String[] args) {
new BJOrderPizza();
//new LDPepperPizza();
}
/**
* 创建披萨
* @param orderType
* @return
*/
abstract Pizza createPizza(String orderType);
public OrderPizza() {
Pizza pizza = null;
String orderType; // 订购披萨的类型
do {
orderType = getType();
pizza = createPizza(orderType);
if (pizza != null) {
//订购成功
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} else {
System.out.println(" 订购披萨失败 ");
break;
}
} while (true);
}
/**
* 获取客户希望订购的披萨种类
* @return 类型
*/
private String getType() {
try {
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza 种类:");
String str = strin.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
抽象工厂模式就是对简单工厂模式的改进, 可以将简单工厂模式和工厂方法模式进行整合
将工厂抽象成两层, 抽象工厂和具体实现的工厂子类, 可以根据创建对象类型使用对应的工厂子类, 将单个的简单工厂类变成工厂簇, 便于代码的维护和扩展
/**
* @Classname Pizza
* @Description
* @Date 2021/9/28 14:12
* @Author Yzx
*/
public class Pizza {
private String name;
void prepare(){
System.out.println(name + " 披萨准备工作");
}
void bake(){
System.out.println(name + " 披萨烘烤工作");
}
void cut(){
System.out.println(name + " 披萨切割工作");
}
void box(){
System.out.println(name + " 披萨装盒工作");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* @Classname BJCheessPizza
* @Description
* @Date 2021/9/28 17:20
* @Author Yzx
*/
public class BJCheesePizza extends Pizza {
public BJCheesePizza() {
this.setName("北京");
}
}
/**
* @Classname BJPepperPizza
* @Description
* @Date 2021/9/28 17:20
* @Author Yzx
*/
public class BJPepperPizza extends Pizza {
public BJPepperPizza() {
this.setName("北京");
}
}
/**
* @Classname BJCheessPizza
* @Description
* @Date 2021/9/28 17:20
* @Author Yzx
*/
public class LDCheesePizza extends Pizza {
public LDCheesePizza() {
this.setName("伦敦");
}
}
/**
* @Classname BJPepperPizza
* @Description
* @Date 2021/9/28 17:20
* @Author Yzx
*/
public class LDPepperPizza extends Pizza {
public LDPepperPizza() {
this.setName("伦敦");
}
}
/**
* @Classname AbsFactory
* @Description
* @Date 2021/9/29 14:30
* @Author Yzx
*/
public interface AbsFactory {
Pizza createPizza(String orderType);
}
/**
* @Classname BJOrderPizza
* @Description
* @Date 2021/9/28 17:23
* @Author Yzx
*/
public class BJFactory implements AbsFactory {
@Override
public Pizza createPizza(String orderType) {
Pizza pizza = null;
if (orderType.equals("cheese")) {
pizza = new BJCheesePizza();
} else if (orderType.equals("pepper")) {
pizza = new BJPepperPizza();
}
return pizza;
}
}
/**
* @Classname BJOrderPizza
* @Description
* @Date 2021/9/28 17:23
* @Author Yzx
*/
public class LDFactory implements AbsFactory {
@Override
public Pizza createPizza(String orderType) {
Pizza pizza = null;
if (orderType.equals("cheese")) {
pizza = new LDPepperPizza();
} else if (orderType.equals("pepper")) {
pizza = new LDPepperPizza();
}
return pizza;
}
}
/**
* @Classname OrderPizza
* @Description
* @Date 2021/9/28 14:37
* @Author Yzx
*/
public class OrderPizza {
public static void main(String[] args) {
new OrderPizza(new BJFactory());
//new OrderPizza(new LDFactory());
}
public OrderPizza(AbsFactory factory) {
Pizza pizza = null;
String orderType; // 订购披萨的类型
do {
orderType = getType();
pizza = factory.createPizza(orderType);
if (pizza != null) {
//订购成功
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} else {
System.out.println(" 订购披萨失败 ");
break;
}
} while (true);
}
/**
* 获取客户希望订购的披萨种类
* @return 类型
*/
private String getType() {
try {
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza 种类:");
String str = strin.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
工厂模式意义
将实例化对象的提取出来, 放到一个类中统一管理与维护, 达到和主项目的依赖关系的解耦, 从而提高项目的扩展性和维护性
设计模式依赖抽象原则