04 工厂模式

工厂模式

1.1 基本介绍

简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式

  1. 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)

  2. 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式.

简单工厂模式

看一个披萨的项目:要便于披萨种类的扩展,要便于维护

1)披萨的种类很多(比如 GreekPizz、CheesePizz 等)

2)披萨的制作有 prepare,bake, cut, box

3)完成披萨店订购功能。

1)简单工厂模式的设计方案: 定义一个可以实例化 Pizaa 对象的类,封装创建对象的代码。

public class SimpleFactory {

    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(" 奶酪披萨 ");
        }
        return pizza;
    }

    //简单工厂模式也叫静态工厂模式
    public static Pizza createPizza2(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、伦敦的胡椒 pizza。

工厂方法模式介绍

1)工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。

2)工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。

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 "";
		}
	}

}

抽象工厂模式

基本介绍

1)抽象工厂模式:定义了一个 interface 用于创建相关或有依赖关系的对象簇,而无需指明具体的类

2)抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。

3)从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。

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

5)类图

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


//这是工厂子类
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;
	}
}

工厂模式在 JDK-Calendar 应用的源码分析

  1. JDK 中的 Calendar 类中,就使用了简单工厂模式

工厂模式小结

1)工厂模式的意义

将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。

2)三种工厂模式 (简单工厂模式、工厂方法模式、抽象工厂模式)

3)设计模式的依赖抽象原则

  • 创建对象实例时,不要直接 new 类, 而是把这个 new 类的动作放在一个工厂的方法中,并返回。有的书上说, 变量不要直接持有具体类的引用。

  • Ø 不要让类继承具体类,而是继承抽象类或者是实现 interface(接口)

  • Ø 不要覆盖基类中已经实现的方法。

posted @   flypiggg  阅读(34)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示