设计模式-----工厂模式

简单工厂模式 、工厂方法模式、

简单工厂模式:

解决的问题:在更改(需要创建的对象)对象的类时,可能会产生对创建对象的修改,由于创建对象没有集中起来,所以更改起来十分麻烦。运用工厂模式可以有效的解决这一问题。

将创建对象的过程提取出来,放到一个类中,这个类就是工厂类;

这样做使程序 降低耦合,增加可拓展性

 

例子:

//简单工厂类
public class SimpleFactory {

//更加 orderType 返回对应的 Pizza 对象
public 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(" 奶酪披萨 ");
} else if (orderType.equals("pepper")) { pizza = new PepperPizza();
pizza.setName("胡椒披萨");
}


return pizza;
}

 

工厂方法模式:

把获取对象的方法写成抽象方法,在不同的子类中分别实现这个实现这个方法。

//OrderPizza.java 类

package com.atguigu.factory.factorymethod.pizzastore.order;

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;

import com.atguigu.factory.factorymethod.pizzastore.pizza.Pizza;

public abstract class OrderPizza {

//定义一个抽象方法,createPizza ,  让各个工厂子类自己实现
abstract Pizza createPizza(String orderType);

// 构造器
public OrderPizza() { Pizza pizza = null;
String orderType; //  订购披萨的类型
do {
orderType = getType();
pizza = createPizza(orderType); //抽象方法,由工厂子类完成
//输出 pizza 制作过程
pizza.prepare(); pizza.bake();
pizza.cut();
pizza.box();


} while (true);
}


// 写一个方法,可以获取客户希望订购的披萨种类
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 "";
}
}


}
package com.atguigu.factory.factorymethod.pizzastore.order;


import com.atguigu.factory.factorymethod.pizzastore.pizza.BJCheesePizza; import com.atguigu.factory.factorymethod.pizzastore.pizza.BJPepperPizza; import com.atguigu.factory.factorymethod.pizzastore.pizza.Pizza;



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();
}
// TODO Auto-generated method stub return pizza;
}


}
package com.atguigu.factory.factorymethod.pizzastore.order;


import com.atguigu.factory.factorymethod.pizzastore.pizza.BJCheesePizza; import com.atguigu.factory.factorymethod.pizzastore.pizza.BJPepperPizza; import com.atguigu.factory.factorymethod.pizzastore.pizza.LDCheesePizza; import com.atguigu.factory.factorymethod.pizzastore.pizza.LDPepperPizza; import com.atguigu.factory.factorymethod.pizzastore.pizza.Pizza;



public class LDOrderPizza extends OrderPizza {


@Override
Pizza createPizza(String orderType) {


Pizza pizza = null; if(orderType.equals("cheese")) {
pizza = new LDCheesePizza();
} else if (orderType.equals("pepper")) { pizza = new LDPepperPizza();
}
// TODO Auto-generated method stub return pizza;
}


}

 

 

抽象方法:

将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。

用哪个工厂就传哪个工厂对象。

 

package com.atguigu.factory.absfactory.pizzastore.order;


import com.atguigu.factory.absfactory.pizzastore.pizza.Pizza;

//一个抽象工厂模式的抽象层(接口) public interface AbsFactory {
//让下面的工厂子类来 具体实现
public Pizza createPizza(String orderType);
}
package com.atguigu.factory.absfactory.pizzastore.order;


import com.atguigu.factory.absfactory.pizzastore.pizza.BJCheesePizza; import com.atguigu.factory.absfactory.pizzastore.pizza.BJPepperPizza; import com.atguigu.factory.absfactory.pizzastore.pizza.Pizza;

//这是工厂子类
public class BJFactory implements AbsFactory {


@Override
public Pizza createPizza(String orderType) {
System.out.println("~使用的是抽象工厂模式~");
// TODO Auto-generated method stub Pizza pizza = null; if(orderType.equals("cheese")) {
pizza = new BJCheesePizza();
} else if (orderType.equals("pepper")){ pizza = new BJPepperPizza();
}
return pizza;
}


}
package com.atguigu.factory.absfactory.pizzastore.order;
import com.atguigu.factory.absfactory.pizzastore.pizza.LDCheesePizza; import com.atguigu.factory.absfactory.pizzastore.pizza.LDPepperPizza; import com.atguigu.factory.absfactory.pizzastore.pizza.Pizza;



public class LDFactory implements AbsFactory {


@Override
public Pizza createPizza(String orderType) {
System.out.println("~使用的是抽象工厂模式~"); Pizza pizza = null;
if (orderType.equals("cheese")) { pizza = new LDCheesePizza();
} else if (orderType.equals("pepper")) { pizza = new LDPepperPizza();
}
return pizza;
}


}
//OrderPizza.java
package com.atguigu.factory.absfactory.pizzastore.order;


import java.io.BufferedReader;
import java.io.IOException; import java.io.InputStreamReader;

import com.atguigu.factory.absfactory.pizzastore.pizza.Pizza;


public class OrderPizza {


AbsFactory factory;

// 构造器
public OrderPizza(AbsFactory factory) { setFactory(factory);
}


private void setFactory(AbsFactory factory) { Pizza pizza = null;
String orderType = ""; //  用户输入
this.factory = factory; do {
orderType = getType();
// factory  可能是北京的工厂子类,也可能是伦敦的工厂子类
pizza = factory.createPizza(orderType); if (pizza != null) { // 订 购 ok
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} else {
System.out.println("订购失败"); break;
}
} while (true);
}

// 写一个方法,可以获取客户希望订购的披萨种类
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 "";
}
}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值