简介
- 简单工厂模式是由一个工厂对象决定创建出哪一种产品 类的实例。简单工厂模式是工厂模式家族中最简单实用的模式
- 定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
- 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式
- 例题:
- 工厂招人:建造一个工厂需要招收工人,需要招收不同工种的工人,并且有着不同的分工
- 分析:
此种方案违反了 ocp 原则,(对扩展开放,对修改关闭)
当我们给类增加新功能的时候,需要大量的改动代码,不利于程序的后期维护和扩展
- 解决方案:
先定义一个抽象类,用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();
}
}
抽象工厂模式
- 定义了一个 interface 用于创建相关或有依赖关系的对象簇,而无需指明具体的类
- 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
- 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
- 将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应 的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。
- 类图
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();
}
}
}