设计模式学习笔记04 - Java版之工厂模式

1. 简单工厂模式

1.1 基本介绍

  1. 简单工厂模式属于创建型模式, 是工厂模式的一种. 简单工厂模式是由一个工厂对象决定创建哪一个产品类的实例, 简单工厂模式是工厂模式家族中最简单实用的模式
  2. 简单工厂模式: 定义一个创建对象的类, 由这个类来封装实例化对象的行为
  3. 软件开发中, 我们大量创建某类 或 某批对象就会用到工行模式

在这里插入图片描述

1.2 案例:

package com.liyang;

// Step1: 披萨有很多种, 我们做一个抽象类, 然后让别的来泛化它
public abstract class Pizza {
	// 制作披萨
	public void make(){
		
	}
	// 打包披萨
	public void box() {
		
	}
}
package com.liyang;

public class CheesePizza extends Pizza {

	@Override
	public void make() {
		System.out.println("制作奶酪披萨...");
	}

	@Override
	public void box() {
		System.out.println("打包奶酪披萨...");
	}
	
}
package com.liyang;

public class GreekPizza extends Pizza {

	@Override
	public void make() {
		System.out.println("制作Greek披萨...");
	}

	@Override
	public void box() {
		System.out.println("打包Greek披萨...");
	}
	
}
package com.liyang;

// Step2: 销售披萨的店铺, 做成一个类
public class PizzaStore {
	public static void main(String[] args) {
		OrderPizza orderPizza = new OrderPizza(new SingletonFactory());
		orderPizza.useFactory();
	}
}
package com.liyang;

// Step3: PizzaStore类 和 Pizza类之间是订购的关系, 做成一个订购类
public class OrderPizza {
	SingletonFactory singletonFactory = null;
	public OrderPizza(SingletonFactory singletonFactory) {
		this.singletonFactory = singletonFactory;
	}
	
	public void useFactory() {
		singletonFactory.makePizza("GreekPizza");
	}
	
	
}
package com.liyang;

// Step4: 	OrderPizza类如果直接和Pizza类发生关系, 那么假设现在增加了一种新型披萨
//			那么我们首先会增加一个 新型披萨类 让他去实现Pizza, 然后将OrderPizza类的代码改变
//			但是现在有1万中OrderPizza(手机订购, 实体店购买, 饿了么, 美团...), 这1万个全改吗??
//			所以我们在这里做一个简单工厂来解决这种问题...
public class SingletonFactory {
	Pizza pizza = null;
	public void makePizza(String pizzaType) {
		if (pizzaType == "CheesePizza") {
			pizza = new CheesePizza();
		} else if (pizzaType == "GreekPizza") {
			pizza = new GreekPizza();
		} else {
			System.out.println("不好意思, 没有这种类型...");
		}
		pizza.make();
		pizza.box();
	}
}

2. 工厂方法模式

在这里插入图片描述

在这里插入图片描述

package com.liyang;

// Step1: 披萨有很多种, 我们做一个抽象类, 然后让别的来泛化它
public abstract class Pizza {
	// 制作披萨
	public void make(){
		
	}
	// 打包披萨
	public void box() {
		
	}
}
package com.liyang;

public class BJCheesePizza extends Pizza {

	@Override
	public void make() {
		System.out.println("制作奶酪披萨...");
	}

	@Override
	public void box() {
		System.out.println("打包奶酪披萨...");
	}
	
}
package com.liyang;

public class SHGreekPizza extends Pizza {

	@Override
	public void make() {
		System.out.println("制作Greek披萨...");
	}

	@Override
	public void box() {
		System.out.println("打包Greek披萨...");
	}
	
}
package com.liyang;

// Step2: 销售披萨的店铺, 做成一个类
public class PizzaStore {
	public static void main(String[] args) throws Exception {
		// 根据不同的城市选择不同的城市的实现类
		String privince = "BJ";
		if (privince == "BJ") {
			new BJOrderPizza();
		} else {
			throw new Exception("没有这个城市...");
		}
	}
}
package com.liyang;

// Step3: PizzaStore类 和 Pizza类之间是订购的关系, 做成一个订购类 抽象的
public abstract class OrderPizza {
	
	// 抽象方法, 让具体的类去实现
	public abstract void createPizza(String orderType);
	
	public OrderPizza() {
		createPizza("Cheese");
	}
}
package com.liyang;

public class BJOrderPizza extends OrderPizza {
	@Override
	public void createPizza(String orderType) {
		if (orderType == "Cheese") {
			System.out.println("创建BJ的Cheese披萨...");
		} else {
			System.out.println("没有这种类型...");
		}
	}
}

3. 抽象工厂模式

  1. 定义一个interface用于创建相关或有依赖关系的对象簇而无需指明类
  2. 抽象方法模式可以将简单工厂模式工厂方法模式进行整合
  3. 从设计层面看, 抽象工厂模式就是对简单工厂模式的改进
  4. 将工厂抽象成两层, AbsFactory(抽象工厂) 和 具体的实现工厂子类. 程序员可以根据创建对象类型使用相应工厂子类. 这样将单个简单工厂变成工厂簇, 更利于代码的维护和扩展…

在这里插入图片描述
在这里插入图片描述

package com.liyang;

// Step1: 披萨有很多种, 我们做一个抽象类, 然后让别的来泛化它
public abstract class Pizza {
	// 制作披萨
	public void make(){
		
	}
	// 打包披萨
	public void box() {
		
	}
}
package com.liyang;

public class BJCheesePizza extends Pizza {

	@Override
	public void make() {
		System.out.println("制作奶酪披萨...");
	}

	@Override
	public void box() {
		System.out.println("打包奶酪披萨...");
	}
	
}
package com.liyang;

public class SHGreekPizza extends Pizza {

	@Override
	public void make() {
		System.out.println("制作Greek披萨...");
	}

	@Override
	public void box() {
		System.out.println("打包Greek披萨...");
	}
	
}
package com.liyang;

// Step2: 销售披萨的店铺, 做成一个类
public class PizzaStore {
	public static void main(String[] args) throws Exception {
		OrderPizza orderPizza = new OrderPizza();
		orderPizza.useFactory();
	}
}
package com.liyang;

// Step3: PizzaStore类 和 Pizza类之间是订购的关系, 做成一个订购类
public class OrderPizza {
	public void useFactory() {
		String privice = "BJ";
		String orderPizza = "Cheese";
		if (privice == "BJ") {
			BJFactory bjFactory = new BJFactory();
			bjFactory.createPizza(orderPizza);
		} else {
			System.out.println("没有这个城市...");
		}
	}
}
package com.liyang;

// Step4: 抽象工厂
public interface AbsFactory {
	public void createPizza(String orderType);
}
package com.liyang;

public class BJFactory implements AbsFactory {

	@Override
	public void createPizza(String orderType) {
		if (orderType == "Cheese") {
			System.out.println("制作BJ的Cheese披萨...");
		} else {
			System.out.println("没有这种披萨...");
		}

	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值