二十三种设计模式(第二种、第三种)—各种工厂
尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&seid=11487053970269878470
简单工厂模式(不在23种设置模式之中)
- 简单工厂模式是属于创建型的模式,是工厂模式的一种。**简单工厂模式是由一个工厂对象决定创建哪一个产品类的实例。**简单工厂模式是工厂模式家族种最简单实用的模式,又叫静态工厂模式
- 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的 行为(代码)
- 在软件开发中,当我们会用到大量的创建某种、某类或某批对象时,就会使用到工厂模式。
需求
看一个披萨的项目:要便于披萨种类的扩展,要便于维护
1)披萨的种类很多(比如GreekPizz、ChessePizz等)
2)披萨的制作有prepare,bake,cut,box
3)完成披萨店订购功能
类图
代码
- 披萨抽象类
public abstract class Pizza {
//名字
protected String name;
//准备原材料,不同的披萨不同,因此,做抽象方法
public abstract void prepare();
public void bake() {
System.out.println(name + "baking;");
}
public void cut() {
System.out.println(name + "cutting;");
}
//打包
public void box() {
System.out.println(name + "box;");
}
public void setName(String name){
this.name = name;
}
}
2.各种披萨实现类
public class CheesePizza extends Pizza {
@Override
public void prepare() {
System.out.println("给制作奶酪披萨 准备原材料");
}
}
-----
public class GreekPizza extends Pizza {
@Override
public void prepare() {
System.out.println("给希腊披萨准备原材料");
}
}
----
public class PepperPizza extends Pizza {
@Override
public void prepare() {
System.out.println("给胡椒披萨准备原材料");
}
}
3 静态工厂 用于选择性创建披萨
public class SimpleFactory {
/**
* 根据orderType 返回对应的Pizza对象
* @param orderType
* @return
*/
public static Pizza createPizza(String orderType){
System.out.println("使用静态工厂模式");
Pizza pizza = null;
if("greek".equals(orderType)){
pizza = new GreekPizza();
pizza.setName("希腊披萨");
}else if("cheese".equals(orderType)){
pizza = new CheesePizza();
pizza.setName("奶酪披萨");
}else if("pepper".equals(orderType)){
pizza = new PepperPizza();
pizza.setName("胡椒披萨");
}
return pizza;
}
}
4 订购披萨
public class OrderPizza02 {
//构造方法
public OrderPizza02(){
String orderType = "";
do{
orderType = getType();
Pizza pizza = SimpleFactory02.createPizza(orderType);
//输出pizza
if(pizza != null){ //订购成功
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}else {
System.out.println("订购披萨失败");
break;
}
}while(true);
}
//写一个方法,可以动态获取客户希望订购的披萨类型
private String getType(){
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("input pizza type:");
return br.readLine();
}catch (IOException e){
e.printStackTrace();
return "";
}
}
}
工厂方法
- 将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐之类中具体实现
- 定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式 将对象的实例化推迟到子类
需求
披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如北京的奶酪pizza、北京的胡椒pizza、伦敦的奶酪pizza、伦敦的胡椒pizza
类图
代码
1 Pizza抽象类
public abstract class Pizza {
//名字
protected String name;
//准备原材料,不同的披萨不同,因此,做抽象方法
public abstract void prepare();
public void bake() {
System.out.println(name + "baking;");
}
public void cut() {
System.out.println(name + "cutting;");
}
//打包
public void box() {
System.out.println(name + "box;");
}
public void setName(String name){
this.name = name;
}
}
2 Pizza各子类
public class BjCheesePizza extends Pizza {
@Override
public void prepare() {
setName("北京的奶酪pizza");
System.out.println("北京的奶酪pizza 准备原材料");
}
}
----
public class BjPepperPizza extends Pizza {
@Override
public void prepare() {
setName("北京胡椒pizza");
System.out.println("给北京的胡椒pizza准备原材料");
}
}
----
public class LdCheesePizza extends Pizza {
@Override
public void prepare() {
setName("伦敦的奶酪pizza");
System.out.println("伦敦的奶酪pizza 准备原材料");
}
}
----
public class LdPepperPizza extends Pizza {
@Override
public void prepare() {
setName("伦敦胡椒pizza");
System.out.println("给伦敦的胡椒pizza准备原材料");
}
}
3 OrderPizza抽象类
public abstract class OrderPizza {
//构造方法
public OrderPizza() {
String orderType; //订购披萨的类型
do {
orderType = getType();
Pizza pizza = createPizza(orderType); //由子类实现
//输出pizza 制作过程
if(pizza!=null){
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}else {
break;
}
} while (true);
}
//写一个方法,可以动态获取客户希望订购的披萨类型
private String getType() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("input pizza type:");
return br.readLine();
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
//定义一个抽象方法,createPizza,让各个工厂子类自己实现
protected abstract Pizza createPizza(String orderType);
}
4 OrderPizza抽象类各子类
public class BjOrderPizza extends OrderPizza {
@Override
protected Pizza createPizza(String orderType) {
Pizza pizza = null;
if("cheese".equals(orderType)){
pizza = new BjCheesePizza();
}else if("pepper".equals(orderType)){
pizza = new BjPepperPizza();
}
return pizza;
}
}
----
public class LdOrderPizza extends OrderPizza {
@Override
protected Pizza createPizza(String orderType) {
Pizza pizza = null;
if("cheese".equals(orderType)){
pizza = new LdCheesePizza();
}else if("pepper".equals(orderType)){
pizza = new LdPepperPizza();
}
return pizza;
}
}
抽象工厂模式
- 定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体类
- 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合
- 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)
- 将工厂抽象成两成,AbsFactroy(抽象工厂)和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个简单工厂类变成工厂簇,更利于代码的维护和扩展。
- 类图
代码
1 Pizza抽象类
public abstract class Pizza {
//名字
protected String name;
//准备原材料,不同的披萨不同,因此,做抽象方法
public abstract void prepare();
public void bake() {
System.out.println(name + "baking;");
}
public void cut() {
System.out.println(name + "cutting;");
}
//打包
public void box() {
System.out.println(name + "box;");
}
public void setName(String name){
this.name = name;
}
}
2 Pizza抽象类各子类
public class BjCheesePizza extends Pizza {
@Override
public void prepare() {
setName("北京的奶酪pizza");
System.out.println("北京的奶酪pizza 准备原材料");
}
}
-----
public class BjPepperPizza extends Pizza {
@Override
public void prepare() {
setName("北京胡椒pizza");
System.out.println("给北京的胡椒pizza准备原材料");
}
}
----
public class LdCheesePizza extends Pizza {
@Override
public void prepare() {
setName("伦敦的奶酪pizza");
System.out.println("伦敦的奶酪pizza 准备原材料");
}
}
----
public class LdPepperPizza extends Pizza {
@Override
public void prepare() {
setName("伦敦胡椒pizza");
System.out.println("给伦敦的胡椒pizza准备原材料");
}
}
3 抽象工厂
public interface AbstractFactory {
//让下面的子类具体实现
Pizza createPizza(String orderType);
}
4 抽象工厂各实现类
public class BjFactory implements AbstractFactory {
@Override
public Pizza createPizza(String orderType) {
Pizza pizza = null;
if ("cheese".equals(orderType)) {
pizza = new BjCheesePizza();
} else if ("pepper".equals(orderType)) {
pizza = new BjPepperPizza();
}
return pizza;
}
}
-----
public class LdFactory implements AbstractFactory {
@Override
public Pizza createPizza(String orderType) {
Pizza pizza = null;
if ("cheese".equals(orderType)) {
pizza = new LdCheesePizza();
} else if ("pepper".equals(orderType)) {
pizza = new LdPepperPizza();
}
return pizza;
}
}
5 订购披萨
public class OrderPizza {
AbstractFactory abstractFactory;
//构造器
public OrderPizza(AbstractFactory abstractFactory){
setAbstractFactory(abstractFactory);
}
private void setAbstractFactory(AbstractFactory abstractFactory) {
Pizza pizza = null;
String orderType = ""; //用户输入
this.abstractFactory = abstractFactory;
do {
orderType = getType();
//abstractFactory 可能是北京工厂子类,也可是伦敦工厂子类
pizza = abstractFactory.createPizza(orderType);
if (pizza != null) {
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.bake();
} else {
break;
}
} while (true);
}
private String getType() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("input pizza type:");
return br.readLine();
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}