工厂模式(设计模式学习笔记)

简介

  1. 简单工厂模式是由一个工厂对象决定创建出哪一种产品 类的实例。简单工厂模式是工厂模式家族中最简单实用的模式
  2. 定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
  3. 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式
  4. 例题:
  1. 工厂招人:建造一个工厂需要招收工人,需要招收不同工种的工人,并且有着不同的分工
  2. 分析:
    在这里插入图片描述
    此种方案违反了 ocp 原则,(对扩展开放,对修改关闭)
    当我们给类增加新功能的时候,需要大量的改动代码,不利于程序的后期维护和扩展
  1. 解决方案:
    在这里插入图片描述

先定义一个抽象类,用Company管理Worker

public abstract class Company {
	protected String name;

	public abstract void Prepare();

	public void Act1() {
		System.out.println(name + "的第一个动作");
	}

	public void Act2() {
		System.out.println(name + "的第二个动作");
	}

	public void Act3() {
		System.out.println(name + "的第三个动作");
	}

	public void setName(String name) {
		this.name = name;
	}

}

对应的子类Worker

public class Worker1 extends Company {

	@Override
	public void Prepare() {
		// TODO Auto-generated method stub
		System.out.println("Worder1");
	}

}

public class Worker2 extends Company {

	@Override
	public void Prepare() {
		// TODO Auto-generated method stub
		System.out.println("Worder2");
	}

}

public class Worker3 extends Company {

	@Override
	public void Prepare() {
		// TODO Auto-generated method stub
		System.out.println("Worder3");
	}

}

简单工厂SimplyFactory

public class SimplyFactory {
	Company com = null;

	public Company CreateFactory(String Type) {
		if (Type.equals("1")) {
			com = new Worker1();
			com.setName("工人1");
		} else if (Type.equals("2")) {
			com = new Worker2();
			com.setName("工人2");
		} else if (Type.equals("3")) {
			com = new Worker3();
			com.setName("工人3");
		} else {
			return null;
		}
		return com;
	}
	
	
	public static Company CreateFactory1(String Type) {
		Company com = null;
		if (Type.equals("1")) {
			com = new Worker1();
			com.setName("工人1");
		} else if (Type.equals("2")) {
			com = new Worker2();
			com.setName("工人2");
		} else if (Type.equals("3")) {
			com = new Worker3();
			com.setName("工人3");
		} else {
			return null;
		}
		return com;
	}
}

模式1(利用构造器传值)Order1类

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

import Worker.Company;

public class Order1 {

	SimplyFactory sim;
	Company com;

	public Order1(SimplyFactory sim) {
		super();
		this.sim = sim;
		setSim(sim);
	}

	public SimplyFactory getSim() {
		return sim;
	}

	public void setSim(SimplyFactory sim) {
		this.sim = sim;
		String in = "";
		do {

			in = getType();
			com = this.sim.CreateFactory(in);
			if (com != null) {
				com.Act1();
				com.Act2();
				com.Act3();
			} else {
				System.out.println("Failed");
				break;
			}
		} while (true);
	}

	// 获取客户的需求
	private String getType() {
		try {
			BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
			System.out.println("input :");
			String str = strin.readLine();
			return str;
		} catch (IOException e) {
			e.printStackTrace();
			return "";
		}
	}

}

模式2(通过静态方法直接调用)Order2

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

import Worker.Company;

public class Order2 {

	SimplyFactory sim;
	Company com;

	public Order2() {
		setSim();
	}

	public SimplyFactory getSim() {
		return sim;
	}

	public void setSim() {
	
		String in = "";
		do {

			in = getType();
			com = SimplyFactory.CreateFactory1(in);
			if (com != null) {
				com.Act1();
				com.Act2();
				com.Act3();
			} else {
				System.out.println("Failed");
				break;
			}
		} while (true);
	}

	// 获取客户的需求
	private String getType() {
		try {
			BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
			System.out.println("input :");
			String str = strin.readLine();
			return str;
		} catch (IOException e) {
			e.printStackTrace();
			return "";
		}
	}

}

客户端测试 Client

public class Client {
	public static void main(String[] args) {
		//简单工厂模式
		//new Order1(new SimplyFactory());
		
		
		new Order2();
	}
}

抽象工厂模式

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

public abstract class AbsCompany {
	protected String name;

	public abstract void Prepare();

	public void setName(String name) {
		this.name = name;
	}

	public void Act1() {
		System.out.println(name + "ACT1");
	}

	public void Act2() {
		System.out.println(name + "ACT2");
	}

	public void Act3() {
		System.out.println(name + "ACT3");
	}

}


具体实现的子类

public class Worker1 extends AbsCompany{

	@Override
	public void Prepare() {
		// TODO Auto-generated method stub
		System.out.println("Worker1报道");
	}

}

public class Worker2 extends AbsCompany{

	@Override
	public void Prepare() {
		// TODO Auto-generated method stub
		System.out.println("Worker2报道");
	}

}

public class Worker3 extends AbsCompany{

	@Override
	public void Prepare() {
		// TODO Auto-generated method stub
		System.out.println("Worker3报道");
	}

}
public class Worker4 extends AbsCompany{

	@Override
	public void Prepare() {
		// TODO Auto-generated method stub
		System.out.println("Worker4报道");
	}

}

公司一

public class Company1 implements AbsFactory {

	@Override
	public AbsCompany createFactory(String Type) {
		// TODO Auto-generated method stub
		AbsCompany com = null;
		System.out.println("公司一,(两种工种(1,2)");
		if (Type.equals("1")) {
			com = new Worker1();
			com.setName("工种一");
		} else if (Type.equals("2")) {
			com = new Worker2();
			com.setName("工种二");
		} else {
			return null;
		}
		return com;
	}

}

公司二

public class Company2 implements AbsFactory {

	@Override
	public AbsCompany createFactory(String Type) {
		// TODO Auto-generated method stub
		AbsCompany com = null;
		System.out.println("公司二,(两种工种(3,4)");
		if (Type.equals("3")) {
			com = new Worker3();
			com.setName("工种一");
		} else if (Type.equals("4")) {
			com = new Worker4();
			com.setName("工种二");
		} else {
			return null;
		}
		return com;
	}

}

AbsFactory 接口

public interface AbsFactory {
	public AbsCompany createFactory(String Type);
}

Order1 (提供company1的接入端)

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

import AbsWorker.AbsCompany;

public class Order1 {
	AbsFactory fac = null;

	public Order1() {
		fac = new Company1();
		setCompany1(fac);
	}

	public void setCompany1(AbsFactory fac) {
		String Type = null;
		AbsCompany com = null;
		do {
			Type = getType();

			com = fac.createFactory(Type);
			if (com != null) {
				com.Prepare();
				com.Act1();
				com.Act2();
				com.Act3();
			} else {
				System.out.println("Failed");
				break;
			}
		} while (true);

	}

	// 获取客户的需求
	private String getType() {
		try {
			BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
			System.out.println("input :");
			String str = strin.readLine();
			return str;
		} catch (IOException e) {
			e.printStackTrace();
			return "";
		}
	}

}

Order2 (提供company2的接入端)

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

import AbsWorker.AbsCompany;

public class Order2 {
	AbsFactory fac = null;

	public Order2() {
		fac = new Company2();
		setCompany2(fac);
	}

	public void setCompany2(AbsFactory fac) {
		String Type = null;
		AbsCompany com = null;
		do {
			Type = getType();

			com = fac.createFactory(Type);
			if (com != null) {
				com.Prepare();
				com.Act1();
				com.Act2();
				com.Act3();
			} else {
				System.out.println("Failed");
				break;
			}
		} while (true);

	}

	// 获取客户的需求
	private String getType() {
		try {
			BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
			System.out.println("input :");
			String str = strin.readLine();
			return str;
		} catch (IOException e) {
			e.printStackTrace();
			return "";
		}
	}

}

Client客户端

import java.util.Scanner;

public class Cilent {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入:");
		String Type = sc.next();
		
		if (Type.equals("com1")) {
			new Order1();
		} else if (Type.equals("com2")) {
			new Order2();
		} else {
			System.out.println("没有资源");
			sc.close();
		}
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐 昊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值