目录
需求
基本介绍
代码示例
需求
基本介绍
代码示例
基本介绍
代码示例
小结
简单工厂模式 需求
做一个披萨的项目:要便于披萨种类的拓展,要便于维护
- 披萨的种类很多
- 披萨的制作有prepare,bake,cut,box
- 完成披萨店订购功能
- 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实施。简单工厂模式是工厂模式家族中最简单实用的模式。
- 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
- 在软件开发中,当我们会用到大量的创建某种、某类或某批对象时,就会使用到工厂模式
package com.zjb.design.factory.simple;
/**
* @Author Kim
* @Date 2022/4/23 13:28
* @Desc 披萨抽象类
*/
public abstract class Pizza {
private String name;
abstract void prepare();
public void bake(){
System.out.println(name + "披萨正在制作");
}
public void cut(){
System.out.println(name + "披萨正在切割");
}
public void box(){
System.out.println(name + "披萨正在打包");
}
public void setName(String name) {
this.name = name;
}
}
package com.zjb.design.factory.simple;
/**
* @Author Kim
* @Date 2022/4/23 13:32
* @Desc 至尊披萨
*/
public class SupremePizza extends Pizza{
@Override
void prepare() {
System.out.println("正在准备原材料");
}
}
package com.zjb.design.factory.simple;
/**
* @Author Kim
* @Date 2022/4/23 13:33
* @Desc 美式披萨
*/
public class AmericanPizza extends Pizza{
@Override
void prepare() {
System.out.println("正在准备原材料");
}
}
package com.zjb.design.factory.simple;
/**
* @Author Kim
* @Date 2022/4/23 13:34
* @Desc
*/
public class SimpleFactory {
public static Pizza createPizza(String pizzaType){
Pizza pizza = null;
if(pizzaType.equals("supreme")){
pizza = new SupremePizza();
pizza.setName("至尊");
}else if(pizzaType.equals("american")){
pizza = new AmericanPizza();
pizza.setName("美式");
}
return pizza;
}
}
package com.zjb.design.factory.simple;
/**
* @Author Kim
* @Date 2022/4/23 13:36
* @Desc 订购披萨
*/
public class OrderPizza {
Pizza pizza = null;
public OrderPizza(String pizzaType){
pizza = SimpleFactory.createPizza(pizzaType);
if(pizza == null){
System.out.println("订购披萨失败:为找到相应的披萨种类");
}else{
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}
}
}
package com.zjb.design.factory.simple;
/**
* @Author Kim
* @Date 2022/4/23 13:28
* @Desc 披萨的客户端
*/
public class PizzaStore {
public static void main(String[] args) {
new OrderPizza("supreme");
}
}
工厂方法模式
需求
在点披萨时,可以点不同的口味,比如:北京的奶酪披萨,北京的胡椒披萨
基本介绍- 工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。
- 工厂方法模式:定义一个创建对象的抽象方法,由子类决定是要实例化的类。工厂方法模式将对象的实例化推迟到子类。
package com.zjb.design.factory.factorymethod;
/**
* @Author Kim
* @Date 2022/4/23 14:26
* @Desc
*/
public abstract class Pizza {
private String name;
abstract void prepare();
public void bake(){
System.out.println(name + "披萨正在制作");
}
public void cut(){
System.out.println(name + "披萨正在切割");
}
public void box(){
System.out.println(name + "披萨正在打包");
}
public void setName(String name) {
this.name = name;
}
}
package com.zjb.design.factory.factorymethod;
/**
* @Author Kim
* @Date 2022/4/23 14:27
* @Desc 伦敦胡椒
*/
public class LDPepperPizza extends Pizza{
@Override
void prepare() {
setName("伦敦胡椒");
System.out.println("正在准备原材料");
}
}
package com.zjb.design.factory.factorymethod;
/**
* @Author Kim
* @Date 2022/4/23 14:27
* @Desc 伦敦奶酪
*/
public class LDCheesePizza extends Pizza{
@Override
void prepare() {
setName("伦敦奶酪");
System.out.println("正在准备原材料");
}
}
package com.zjb.design.factory.factorymethod;
/**
* @Author Kim
* @Date 2022/4/23 14:27
* @Desc 北京胡椒
*/
public class BJPepperPizza extends Pizza{
@Override
void prepare() {
setName("北京胡椒");
System.out.println("正在准备原材料");
}
}
package com.zjb.design.factory.factorymethod;
/**
* @Author Kim
* @Date 2022/4/23 14:27
* @Desc 北京奶酪
*/
public class BJCheesePizza extends Pizza{
@Override
void prepare() {
setName("北京奶酪");
System.out.println("正在准备原材料");
}
}
package com.zjb.design.factory.factorymethod;
/**
* @Author Kim
* @Date 2022/4/23 14:29
* @Desc
*/
public abstract class OrderPizza {
abstract Pizza createPizza(String orderType);
public OrderPizza(String orderType){
Pizza pizza = createPizza(orderType);
if(pizza == null){
System.out.println("订购披萨失败:为找到相应的披萨种类");
}else{
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}
}
}
package com.zjb.design.factory.factorymethod;
/**
* @Author Kim
* @Date 2022/4/23 14:34
* @Desc
*/
public class LDOrderPizza extends OrderPizza{
public LDOrderPizza(String orderType) {
super(orderType);
}
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if(orderType.equals("cheese")){
pizza = new LDCheesePizza();
}else if(orderType.equals("pepper")){
pizza = new LDCheesePizza();
}
return pizza;
}
}
package com.zjb.design.factory.factorymethod;
/**
* @Author Kim
* @Date 2022/4/23 14:34
* @Desc
*/
public class BJOrderPizza extends OrderPizza{
public BJOrderPizza(String orderType) {
super(orderType);
}
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if(orderType.equals("cheese")){
pizza = new BJCheesePizza();
}else if(orderType.equals("pepper")){
pizza = new BJPepperPizza();
}
return pizza;
}
}
package com.zjb.design.factory.factorymethod;
/**
* @Author Kim
* @Date 2022/4/23 13:28
* @Desc 披萨的客户端
*/
public class PizzaStore {
public static void main(String[] args) {
new BJOrderPizza("cheese");
}
}
抽象工厂模式
基本介绍
- 抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类
- 抽象工厂模式可以将简单工厂模式和工厂方法模式整合
- 从设计层面看,抽象工厂模式就是对简单工厂模式的改进
- 将工厂抽象成两层,AbsFactory(抽象工厂)和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样就将单个的简单工厂类变成了工厂簇,更利于代码的维护和拓展。
package com.zjb.design.factory.absfactory;
/**
* @Author Kim
* @Date 2022/4/23 14:58
* @Desc
*/
public interface AbsFactory {
Pizza createPizza(String pizzaType);
}
package com.zjb.design.factory.absfactory;
/**
* @Author Kim
* @Date 2022/4/23 14:59
* @Desc
*/
public class BJFactory implements AbsFactory{
@Override
public Pizza createPizza(String pizzaType) {
Pizza pizza = null;
if(pizzaType.equals("cheese")){
pizza = new BJCheesePizza();
}else if(pizzaType.equals("pepper")){
pizza = new BJPepperPizza();
}
return pizza;
}
}
package com.zjb.design.factory.absfactory;
/**
* @Author Kim
* @Date 2022/4/23 14:59
* @Desc
*/
public class LDFactory implements AbsFactory{
@Override
public Pizza createPizza(String pizzaType) {
Pizza pizza = null;
if(pizzaType.equals("cheese")){
pizza = new LDCheesePizza();
}else if(pizzaType.equals("pepper")){
pizza = new LDPepperPizza();
}
return pizza;
}
}
package com.zjb.design.factory.absfactory;
/**
* @Author Kim
* @Date 2022/4/23 14:27
* @Desc 北京奶酪
*/
public class BJCheesePizza extends Pizza {
@Override
void prepare() {
setName("北京奶酪");
System.out.println("正在准备原材料");
}
}
package com.zjb.design.factory.absfactory;
/**
* @Author Kim
* @Date 2022/4/23 14:27
* @Desc 北京胡椒
*/
public class BJPepperPizza extends Pizza {
@Override
void prepare() {
setName("北京胡椒");
System.out.println("正在准备原材料");
}
}
package com.zjb.design.factory.absfactory;
/**
* @Author Kim
* @Date 2022/4/23 14:27
* @Desc 伦敦胡椒
*/
public class LDPepperPizza extends Pizza {
@Override
void prepare() {
setName("伦敦胡椒");
System.out.println("正在准备原材料");
}
}
package com.zjb.design.factory.absfactory;
/**
* @Author Kim
* @Date 2022/4/23 14:27
* @Desc 伦敦奶酪
*/
public class LDCheesePizza extends Pizza {
@Override
void prepare() {
setName("伦敦奶酪");
System.out.println("正在准备原材料");
}
}
package com.zjb.design.factory.absfactory;
/**
* @Author Kim
* @Date 2022/4/23 14:29
* @Desc
*/
public class OrderPizza {
public OrderPizza(AbsFactory absFactory,String orderType){
Pizza pizza = absFactory.createPizza(orderType);
if(pizza == null){
System.out.println("订购披萨失败:为找到相应的披萨种类");
}else{
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}
}
}
package com.zjb.design.factory.absfactory;
/**
* @Author Kim
* @Date 2022/4/23 13:28
* @Desc 披萨的客户端
*/
public class PizzaStore {
public static void main(String[] args) {
new OrderPizza(new BJFactory(),"cheese");
}
}
小结
- 工厂模式的意义:将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的拓展和维护性
- 设计模式的依赖抽象原则
- 在创建对象实例时,不要直接new类,而是把这个new类的动作放在一个工厂的方法中并返回
- 不要让类继承具体类,而是继承抽象类或者是实现interface接口
- 不要覆盖基类中已经实现的方法
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)