简单工厂模式、工厂方法模式和抽象工厂模式

第四章面向对象程序设计方法
一.题目分析
1.简单工厂模式
使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。
People作为抽象类,它可以是一个接口,也可以是一个抽象类,其中包括了女娲造人方法makePeople()。Man、Women、Robat分别为抽象类People的子类,它是一种具体操作,实现了People接口中定义的方法makePeople(),只不过不同的对象在实现方法时有所不同。
2.工厂方法模式
海尔工厂(Haier)生产海尔空调(HaierAirCondition),美的工厂(Midea)生产美的空调(MideaAirCondition) 。使用工厂方法模式描述该场景,绘制类图并编程实现。
Air是一个抽象类,作为抽象类,它可以是一个接口,也可以是一个抽象类,其中包括了业务方法work()。具体产品类为HaierAir和Midea,它是抽象产品Air接口的子类,是一种具体产品。AirFactory是抽象工厂类,它包含了抽象的工厂方法ProduceAir(),返回一个抽象产品Air类型的对象。HaierAirFactory和MideaAirFactory是具体工厂类,在工厂方法中创建并返回一个对象的具体产品。
3.抽象工程模式
电脑配件生产工厂生产内存、CPU等硬件设备,这些内存、CPU的品牌、型号并不一定相同,根据下面的“产品等级结构-产品族”示意图,使用抽象工厂模式实现电脑配件生产过程并绘制相应的类图,绘制类图并编程实现。
抽象工厂:abfactory。 抽象方法功能:创建一个工厂。具体工厂:Pcfactory,Macfactory。抽象产品:cpu,ram。具体产品:。(Pc牌)Pccpu,Pcram。(Mac牌)Maccpu,Macram。Pcfactory生产Pc牌,Macfactory生产Mac牌。即一个工厂生产一个产品族不同产品等级结构的产品。
在这里插入图片描述
二.类图设计
1.简单工厂模式
在这里插入图片描述

2.工厂方法模式
在这里插入图片描述

3.抽象工程模式
在这里插入图片描述
三.实现过程
1.简单工厂模式

    package make_people;
    public interface People {
    	public void makePeople();
    }
    public class Man implements People {
    	public void makePeople() {
    		// TODO Auto-generated method stub
    		System.out.println("出现男人");
    	}
    }
    public class Woman implements People {
    	public void makePeople() {
    		// TODO Auto-generated method stub
    		System.out.println("出现女人");
    	}
    }
    public class Robat implements People {
    	public void makePeople() {
    		// TODO Auto-generated method stub
    		System.out.println("出现机器人");
    	}
    }
    public class Nvwa {
    	public static People getPeople(String arg) {
    		People people=null;
    		if(arg.equalsIgnoreCase("M")) {
    			people=new Man();
    			System.out.println("女娲造男人");
    		}
    		else if(arg.equalsIgnoreCase("W"))
    		{
    			people=new Woman();
    			System.out.println("女娲造女人");
    		}
    		else if(arg.equalsIgnoreCase("R"))
    		{
    			people=new Robat();
    			System.out.println("女娲造机器人");
    		}
    		return people;
    	}
    }
    class Client { 
    	public static void main(String[] args) {
    		People p;
    		p=Nvwa.getPeople("R");
    		p.makePeople();
    	}
    }

2.工厂方法模式

package AirCondition;
public interface Air {
	public void work();
}
public interface AirFactory {
	Air ProduceAir();
}
public class HaierAir implements Air{
	public void work() {
		System.out.println("海尔工厂正在生产海尔空调!");
	}
}
public class HaierAirFactory implements AirFactory{
	public HaierAir ProduceAir() {
		System.out.println("生产了海尔空调!");
		return new HaierAir();
	}
}
public class MideaAir implements Air{
	public void work() {
		System.out.println("美的工厂正在生产美的空调!");
	}
}
public class MideaAirFactory implements AirFactory{
	public MideaAir ProduceAir() {
		System.out.println("生产了美的空调!");
		return new MideaAir();
	}
}
public class Test {
	public static void main(String[] args) {
		AirFactory airfactory=new HaierAirFactory();
		Air air=airfactory.ProduceAir();
		airfactory=new MideaAirFactory();
		air=airfactory.ProduceAir();
	}
}

3.抽象工厂模式

package abstrac_t;
public interface abfactory {
    public cpu productcpu();
    public ram productram();
}
public class Macfactory implements abfactory {
    //实例化一个Mac端CPU,返回,下面相同
    public cpu productcpu() {
        return new Maccpu();
    }
    public ram productram() {
        return new Macram();
    }
}
public class Pcfactory implements abfactory {
    public cpu productcpu() {
        return new Pccpu();
    }

    public ram productram() {
        return new Pcram();
    }
}
public interface cpu {
    public void productedcpu();
}
public class Pccpu implements cpu {
    public void productedcpu(){
        System.out.println("Pc端CPU已生产!");
    }
}
public class Maccpu implements cpu {
    public void productedcpu(){
        System.out.println("Mac端CPU已生产!");
    }
}
public interface ram {
    public void productedram();
}
public class Pcram implements ram {
    public void productedram(){
        System.out.println("Pc端内存已生产!");
    }
}
public class Macram implements ram {
    public void productedram(){
        System.out.println("Mac端内存已生产!");
    }
}
public class client {
    public static void main(String[] args){
        cpu cpu;
        ram ram;
        abfactory factory;
        //首先生产Pc端的产品族
        factory = new Macfactory();
        cpu = factory.productcpu();
        ram = factory.productram();
        cpu.productedcpu();
        ram.productedram();
    }
}

四.运行结果
1.简单工厂模式

存在Man类,传参M,则返回一个Man对象,程序运行结果如下:
在这里插入图片描述

存在Woman类,传参M,则返回一个Woman对象,程序运行结果如下:
在这里插入图片描述
当增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,程序运行结果如下:
在这里插入图片描述
2.工厂方法模式
在这里插入图片描述

3.抽象工程模式

在这里插入图片描述
五.归纳总结
1.简单工厂模式
简单工厂模式优点:工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责"消费"对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系的优化。
简单工厂缺点:
(1)由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
(2)当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
(3)这些缺点在工厂方法模式中得到了一定的克服。
2.工厂方法模式
服了简单工厂违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性,所以说“工厂模式”是“简单工厂模式”的进一步抽象和推广。但是每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。
3.抽象工程模式
抽象工厂模式优点:
(1)隔离了具体类的生成,使得客户端并不需要知道什么被创建。
(2)当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
(3)增加新的产品族很方便,无须修改已有系统,符合开闭原则。
抽象工厂模式缺点:
(1)增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了开闭原则。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用简单工厂模式模拟女娲造人的代码: 首先,我们需要定义一个Person接口,包含一个实现生命的方法: ```java public interface Person { void live(); } ``` 然后,我们定义MAN、Woman和Robot三个类,它们实现了Person接口: ```java public class MAN implements Person { @Override public void live() { System.out.println("I am a man, I can work hard."); } } public class Woman implements Person { @Override public void live() { System.out.println("I am a woman, I can give birth to a baby."); } } public class Robot implements Person { @Override public void live() { System.out.println("I am a robot, I can do things that human can't do."); } } ``` 接下来,我们定义一个简单工厂类,根据传入参数来创建相应的对象: ```java public class PersonFactory { public static Person createPerson(String type) { if ("M".equals(type)) { return new MAN(); } else if ("W".equals(type)) { return new Woman(); } else if ("R".equals(type)) { return new Robot(); } else { throw new IllegalArgumentException("Invalid type: " + type); } } } ``` 最后,我们可以在客户端代码中使用工厂来创建相应的对象: ```java public class Client { public static void main(String[] args) { Person man = PersonFactory.createPerson("M"); man.live(); Person woman = PersonFactory.createPerson("W"); woman.live(); Person robot = PersonFactory.createPerson("R"); robot.live(); } } ``` 输出结果为: ``` I am a man, I can work hard. I am a woman, I can give birth to a baby. I am a robot, I can do things that human can't do. ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值