1、设计模式1自己总结的Java开发中的23种设计模式,通俗易懂有实例代码 (2011-11-24 14:14:00)转载标签:java设计模式杂谈分类:Java笔记_基础很重要从追MM谈Java的23种设计模式1、FACTORY追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory.工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客
2、户端提供。程序代码以下是引用片段:Java代码1. publciclassSample2. .3. 4. 5. publicclassAextendsSample6. .7. 8. 9. publicclassBextendsSample10. .11. 工厂类处于决定实例化那个产品类的中心位置Java代码1. publicclassFactory2. 3. /静态工厂方法,无必要再去实例化这个工厂类,增加没有必要的代码4. publicstaticSamplecreate(intwhich)5. if(which=1)6. returnnewA();7. if(which=2)8. retu
3、rnnewB();9. 10. 使用简单工厂初始化一个类Java代码1. SamplenewSample=Factory.create(1);2. 工厂方法模式植物接口及两个实现类Java代码1. publicinterfacePlant2. 3. publicclassPlantAimplementsPlant4. 5. 6. publicclassPlantBimplementsPlant7. 水果接口及两个实现类Java代码1. publicinterfaceFruit2. 3. publicclassFruitAimplementsFruit4. 5. 6. publicclassFr
4、uitBimplementsFruit7. 抽象工厂Java代码1. publicinterfaceAbstractFactory2. publicPlantcreatePlant();3. publicFruitcreatFruit();4. 工厂类AJava代码1. publicClassFactoryAimplementsAbstractFactory2. publicPlantcreatePlant()3. returnnewPlantA();4. 5. publicFruitcreatFruit()6. returnnewFruitA();7. 8. 工厂类BJava代码1. pub
5、licClassFactoryBimplementsAbstractFactory2. publicPlantcreatePlant()3. returnnewPlantB();4. 5. publicFruitcreatFruit()6. returnnewFruitB();7. 8. 工厂模式分为三种:Simple Factory模式专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。Factory Method模式将对象的创建交由父类中定义的一个标准方法来完成,而不是其构造函数,究竟应该创建何种对象由具体的子类负责决定。Abstract Factory模式提供一个共同
6、的接口来创建相互关联的多个对象。一、Simple Factory模式:水果接口:Fruit.javapackage designpattern.factory.simplefactory;public interface Fruit void plant();void enableEat();苹果类实现水果接口:Apple.javapackage designpattern.factory.simplefactory;public class Apple implements FruitOverridepublic void enableEat() System.out.println(Eat
7、 Apple);Overridepublic void plant() System.out.println(Plan Apple);葡萄类实现水果接口:Grape.javapackage designpattern.factory.simplefactory;public class Grape implements FruitOverridepublic void enableEat() System.out.println(Eat Grape);Overridepublic void plant() System.out.println(Plant Grape);买水果工厂类,可根据不同
8、的参数类型返回对应的实例:FruitFactory .javapackage designpattern.factory.simplefactory;public class FruitFactory public static Fruit getFruitFactory(String fruitType)if (fruitType.equals(Apple)return new Apple();if (fruitType.equals(Grape)return new Grape();return null;测试类,根椐不同的输入参数从工厂类中得到对应的实例并调用相应实例的方法:FruitT
9、est.javapackage designpattern.factory.simplefactory;public class FruitTest public static void main(String args) Fruit fruit = FruitFactory.getFruitFactory(Apple);fruit.plant();fruit.enableEat();A:我要需要苹果,只需向工厂角色(FruitFactory)请求即可。而工厂角色在接到请求后,会自行判断创建和提供哪一个产品。B:但是对于工厂角色(FruitFactory)来说,增加新的产品(比如说增加草莓)就
10、是一个痛苦的过程。工厂角色必须知道每一种产品,如何创建它们,以及何时向客户端提供它们。换言之,接纳新的产品意味着修改这个工厂。C:因此Simple Factory模式的开放性比较差。有什么办法可以解决这个问题吗?那就需要Factory Method模式来为我们服务了。二、Factory Method 模式:把水果工厂定义成接口再用各种水果去实现自己的实例,这样做的好处就是如果再增加一种水果,只要增加它的对象和实现工厂就可以了,而不必修改任何代码。水果接口:Fruit.javapackage designpattern.factory.simplefactory;public interface
11、 Fruit void plant();void enableEat();苹果类实现水果接口:Apple.javapackage designpattern.factory.simplefactory;public class Apple implements FruitOverridepublic void enableEat() System.out.println(Eat Apple);Overridepublic void plant() System.out.println(Plan Apple);葡萄类实现水果接口:Grape.javapackage designpattern.f
12、actory.simplefactory;public class Grape implements FruitOverridepublic void enableEat() System.out.println(Eat Grape);Overridepublic void plant() System.out.println(Plant Grape);苹果工厂类:AppleFactory.javapackage designpattern.factory.factorymodel;public class AppleFactory implements FruitFactory Overri
13、depublic Fruit getFruitFactory() return new Pear();葡萄工厂类:GrapeFactory.javapackage designpattern.factory.factorymodel;public class GrapeFactory implements FruitFactory Overridepublic Fruit getFruitFactory() return new Grape();水果工厂类:FruitFactory .javapackage designpattern.factory.factorymodel;public i
14、nterface FruitFactory public Fruit getFruitFactory();测试类:FruitTest.javapackage designpattern.factory.factorymodel;public class FruitTest public static void main(String args) /AppleAppleFactory appleFactory = new AppleFactory();appleFactory.getFruitFactory().plant();appleFactory.getFruitFactory().ena
15、bleEat();/So if you want add pear, you shall add pear and pear factory class./and not need modify anything./PearPearFactory pearFactory = new PearFactory();pearFactory.getFruitFactory().plant();pearFactory.getFruitFactory().enableEat();上面加了一个梨的水果,所以只要添加对应的代码即可。A:工厂方法模式和简单工厂模式在结构上的不同是很明显的。工厂方法模式的核心是一
16、个抽象工厂 类,而简单工厂模式把核心放在一个具体类上。工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而可以成为多个简单工厂模式的综 合,进而推广了简单工厂模式。B:工厂方法模式退化后可以变得很像简单工厂模式。设想如果非常确定一个系统只需要一个具体工 厂类,那么就不妨把抽象工厂类合并到具体的工厂类中去。由于反正只有一个具体工厂类,所以不妨将工厂方法改成为静态方法,这时候就得到了简单工厂模式。 C:如果需要加入一个新的水果,那么只需要加入一个新的水果类以及它所对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体 工厂角色。对于增加新的水果类而言,这
17、个系统完全支持开-闭原则。D:对Factory Method模式而言,它只是针对一种类别(如本例中的水果类Fruit),但如果我们还想买肉,那就不行了,这是就必须要Abstract Method模式帮忙了。三、Abstract Method 模式:A:抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。这就是抽象工厂模式的用意。B:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。C:抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品(Fruit)等级结构;而抽象工厂模式则需要面对多个产品等级结构(
18、Fruit、Meat)。Fruit.javapackage designpattern.factory.abstractfactory;public interface Fruit void plant();void enableEat();Fruit.javapackage designpattern.factory.abstractfactory;public class Apple implements FruitOverridepublic void enableEat() System.out.println(Eat Apple);Overridepublic void plant(
19、) System.out.println(Plan Apple);Grape.javapackage designpattern.factory.abstractfactory;public class Grape implements FruitOverridepublic void enableEat() System.out.println(Eat Grape);Overridepublic void plant() System.out.println(Plant Grape);Pear.javapackage designpattern.factory.abstractfactory
20、;public class Pear implements FruitOverridepublic void enableEat() System.out.println(Eat Pear);Overridepublic void plant() System.out.println(Plan Pear);Apple.javapackage designpattern.factory.abstractfactory;public class Apple implements FruitOverridepublic void enableEat() System.out.println(Eat
21、Apple);Overridepublic void plant() System.out.println(Plan Apple);Meat.javapackage designpattern.factory.abstractfactory;public interface Meat void feed();void enableEat();Cow.javapackage designpattern.factory.abstractfactory;public class Cow implements Meat Overridepublic void enableEat() System.ou
22、t.println(Eat Cow);Overridepublic void feed() System.out.println(Feed Cow);Pig.javapackage designpattern.factory.abstractfactory;public class Pig implements Meat Overridepublic void enableEat() System.out.println(Eat Pig);Overridepublic void feed() System.out.println(Feed Pig);IFactory.javapackage d
23、esignpattern.factory.abstractfactory;public interface IFactory public Fruit getFruitFactory(Fruit whichFruit);public Meat getMeatFactory(Meat whichMeat);MyFactory.javapackage designpattern.factory.abstractfactory;public class MyFactory implements IFactory Overridepublic Fruit getFruitFactory(Fruit w
24、hichFruit) / TODO Auto-generated method stubreturn whichFruit;Overridepublic Meat getMeatFactory(Meat whichMeat) / TODO Auto-generated method stubreturn whichMeat;FruitTest .javapackage designpattern.factory.abstractfactory;public class FruitTest public static void main(String args) Fruit apple = ne
25、w Apple();Meat pig = new Pig();MyFactory my = new MyFactory();my.getFruitFactory(apple).plant();my.getFruitFactory(apple).enableEat();System.out.println(-);my.getMeatFactory(pig).feed();my.getMeatFactory(pig).enableEat();2、BUILDERMM最爱听的就是“我爱你”这句话了,见到不同地方的 MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键
26、,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你”builder。(这一定比美军在伊拉克用的翻译机好卖)建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。java代码/首先是一个建造工具(builder)接口1. publicinterfacebuilder2. 3. voidzhuji();/主机4. voidjianpan();/键盘5. voidxia
27、nshiqi();/显示器6. voidshubiao();/鼠标7. computergetcomputer();/返回产品8. Java代码1. /建造工具的具体建造方式:2. publicclassConcreteBuilderimplementsbuilder3. 4. privateStringzhuji;5. privateStringxianshiqi;6. privateStringjianpan;7. privateStringshubiao;8. Override9. publicvoidzhuji()10. /11. System.out.println(生产主机);12. zhuji=MAC主机;13. 14. 15. Overrid
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1