工厂模式(Factory Pattern)的意义就跟它的名字一样,在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象。工厂模式根据不同的参数来实现不同的分配方案和创建对象。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。例如用工厂来创建 人 这个对象,如果我们需要一个男人对象,工厂就会为我们创建一个男人;如果我们需要一个女人,工厂就会为我们生产一个女人。
普通工厂模式
多个工厂方法模式
静态工厂方法模式
/*
*工厂模式: 在创建对象时不会对客户端暴露创建裸机,而是通过使用一个共同的接口来指向
*新创建的对象。
* 普通工厂模式:
* 多个工厂方法模式:普通工厂模式中,如果传递的字符串出错,则不能正确创建对象,多个宫广场方法模式是
* 提供多个工厂方法,分别创建对象
* 静态工厂方法模式:将多个催工厂方法模式里的方法设置为静态的,则测试或是使用时不需要创建实例,可以直接调用
*/
interface Person{//两个类的共同接口
public void eat();
public void sleep();
public void beat();
}
class Female implements Person{
public void eat(){
System.out.println("Female can eat");
}
public void sleep(){
System.out.println("Female can sleep");
}
public void beat(){
System.out.println("Female can beat");
}
}
class Male implements Person{
public void eat(){
System.out.println("Male can eat");
}
public void sleep(){
System.out.println("Male can sleep");
}
public void beat(){
System.out.println("Male can beat");
}
}
// class HumanFactory{//创建普通工厂类
// public Person createHuman(String gender){
// if(gender.equals("male")){
// return new Male();
// }else if(gender.equals("female")){
// return new Female();
// }else {
// System.out.println("请输入正确的类型:");
// return null;
// }
// }
//}
//
//public class Main {//普通工厂测试类
// public static void main(String[] args){
// HumanFactory factory=new HumanFactory();
// Person male=factory.createHuman("male");
// male.eat();
// male.sleep();
// male.beat();
// }
//}
/*
* 测试结果:
* Male can eat
Male can sleep
Male can beat
*/
// class HumanFactory{//创建多个工厂方法
// public Male createMale(){
// return new Male();
// }
// public Female createFemale(){
// return new Female();
// }
// }
// public class Main{//多个工厂方法测试类
// public static void main(String args[]){
// HumanFactory factory = new HumanFactory();
// Person male= factory.createMale();
// male.eat();
// male.sleep();
// male.beat();
// }
// }
// /*
// * 测试结果:
// * Male can eat
// Male can sleep
// Male can beat
// */
class HumanFactory{//静态工厂方法
public static Male createMale(){
return new Male();
}
public static Female createFemale(){
return new Female();
}
}
public class Main{//静态工厂方法模式测试
public static void main(String args[]){
Person male=HumanFactory.createMale();
male.eat();
male.sleep();
male.beat();
}
}
/*
* 测试结果:
* Male can eat
Male can sleep
Male can beat
*/
/*
* 抽象工厂模式:
* 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,
* 必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,
* 如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,
* 直接增加新的工厂类就可以了,不需要修改之前的代码。
*/
interface Sender{
public void Send();
}
class MailSender implements Sender{
@Override
public void Send() {
// TODO Auto-generated method stub
System.out.println("It's a mailSender!");
}
}
class SmsSender implements Sender{
@Override
public void Send() {
// TODO Auto-generated method stub
System.out.println("It's a SmsSender");
}
}
interface Provider{
public Sender produce();
}
class SendMailFactory implements Provider{
@Override
public Sender produce() {
// TODO Auto-generated method stub
return new MailSender();
}
}
class SendSmsFactory implements Provider{
@Override
public Sender produce() {
// TODO Auto-generated method stub
return new SmsSender();
}
}
public class Main {
public static void main(String args[]){
Provider provider = new SendMailFactory();
Sender sender = provider.produce();
sender.Send();
}
}
/*
* 测试结果:It's a mailSender!
*/
Reference: https://blog.csdn.net/doymm2008/article/details/13288067