一、工厂模式定义介绍
二、工厂模式的分类
- 传统模式
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
1、传统模式
(1)、传统方式的优缺点
- 优点:比较好理解,简单易操作。
- 缺点:违反了设计模式的ocp原则,即对扩展开放,对修改关闭。即当我们给类增加新功能的时候,尽量不修改代码。
(2)、具体实例分析
实现类图
第一步创建Pizza类,将该类做成一个抽象类
/**
* 将Pizza类做成抽象
*/
public abstract class Pizza {
//名字
private String name;
//准备原材料,不同的披萨不一样,因此我们做成抽象方法
public abstract void prepare();
public void bake() {
System.out.println(name + "baking");
}
public void cut() {
System.out.println(name + "cuting");
}
public void box() {
System.out.println(name + "boxing");
}
public void setName(String name) {
this.name = name;
}
}
第二步,这时候有两个不同Pizza子类去继承Pizza类
/*********************GreekPizza子类***********************
public class GreekPizza extends Pizza{
@Override
public void prepare() {
System.out.println("给制作希腊披萨,准备原材料");
}
}
/*********************CheesePizza子类***********************
public class CheesePizza extends Pizza{
@Override
public void prepare() {
System.out.println("给制作奶酪披萨,准备原材料");
}
}
第三步:创建Pizza订单类
/*****************Pizza订单类**********************/
public class 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;
}
//输出pizz制作过程
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}while (true);
}
private String getType() {
try{
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入披萨的类型:");
String string = bufferedReader.readLine();
return string;
}catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
/*****************客户端调用类**********************/
public class PizzaStore {
public static void main(String[] arg){
new OrderPizza();
}
}
/*****************返回结果**********************/
请输入披萨的类型:
greek
给制作希腊披萨,准备原材料
希腊披萨baking
希腊披萨cuting
希腊披萨boxing
请输入披萨的类型:
(3)、对以上传统模式的改进思路
分析:
修改代码可以接受,但是 如果我们在其他地方也有创建Pizza的代码,就意味也要修改,而创建Pizza的代码往往有多处。
思路:
把创建Pizza对象封装到一个类中,这样我们新的Pizza种类时,只需要修改该类即可,其他有创建Pizza的代码就不需要修改了。
2、简单工厂模式
(1)、简单工厂模式定义与介绍
- 它属于创建型模式,是工厂模式的一种。
- 简单工厂模式是由一个工厂对象决定创建出哪一类产品的实例,是最简单一种工厂模式。
- 简单工厂模式定义:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)。
- 在软件开发中,当我们会用到大量的创建某种、某类或某批对象时,就会使用到工厂模式。
(2)、具体实例分析
实现类图:
第一步创建一个简单工厂类
//简单工厂类
public class SimpleFactory {
//根据orderType,返回一个Pizza对象
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;
}
}
第二步创建Pizza订单类
Pizza pizza = null;
//构造器
public OrderPizza() {
setFactory();
}
//定义一个简单的工厂对象
public void setFactory() {
String orderType = "";
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);
}
第三步客户端调用
public class PizzaStore {
public static void main(String[] arg){
//new OrderPizza();
//使用简单工厂模式
new OrderPizza();
System.out.println("退出程序");
}
}
3、工厂方法模式
(1)、工厂方法模式定义
定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。
(2)、实例分析
实例类图
代码实现
/*************************************
public class BJCheesePizza extends Pizza{
@Override
public void prepare() {
setName("北京的奶酪披萨");
System.out.println(" 北京的奶酪披萨准备原材料...");
}
}
public class BJPepperPizza extends Pizza{
@Override
public void prepare() {
setName("北京的胡椒披萨");
System.out.println(" 北京的胡椒披萨准备原材料...");
}
}
/***************创建抽象方法的类**********************
public abstract class OrderPizza {
//定义个抽象方法,让各个工厂子类自己实现
abstract Pizza createPizza(String orderType);
//构造器
public OrderPizza() {
Pizza pizza = null;
String orderType; //订购披萨的类型
do {
orderType = getType();
pizza = createPizza(orderType);
//输出pizz制作过程
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}while (true);
}
}
/******************子类工厂调用父类抽象方法*******************
public class BJOrderPizza extends OrderPizza{
@Override
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;
}
}
/*****************客户端调用********************
public class PizzaStore {
public static void main(String[] arg){
new BJOrderPizza();
}
}
4、抽象工厂模式
(1)、定义介绍
(2)、实例分析
实现类图
具体代码实现
/****************************************/
//抽象工厂模式的抽象层(接口)
public interface AbsFactory {
//让下面工厂子类来具体实现
public Pizza createPizza(String orderType);
}
/****************************************/
//这是工厂子类
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;
}
}
/****************************************/
public class OrderPizza {
AbsFactory absFactory;
//构造器
public OrderPizza(AbsFactory absFactory) {
setFactory(absFactory);
}
public void setFactory(AbsFactory absFactory) {
Pizza pizza = null;
String orderType = ""; //用户输入
this.absFactory = absFactory;
do {
pizza = absFactory.createPizza(orderType);
if (pizza != null) {
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}else {
System.out.println("订购失败");
break;
}
}while (true);
}
}
/****************************************/
public class PizzaStore {
public static void main(String[] arg){
new OrderPizza(new BJFactory());
}
}