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

简介

  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();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44763595/article/details/107864052
今日推荐