第四章面向对象程序设计方法
一.题目分析
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 stubSystem.out.println("出现男人");}}public class Woman implements People {public void makePeople() {// TODO Auto-generated method stubSystem.out.println("出现女人");}}public class Robat implements People {public void makePeople() {// TODO Auto-generated method stubSystem.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)增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了开闭原则。