(4)设计模式方法-创建型设计模式--:简单工厂模式【【【工厂方法模式
来源:互联网 发布:双肩电脑包 知乎 编辑:程序博客网 时间:2024/04/30 11:36
===============================================================
简单工厂模式 别名:静态工厂方法模式
该案例有如下几个元素:
产品接口:
具体产品:
静态工厂类:
客户类:
代码如下:
产品接口:
package 创建型模式.简单工厂模式;/** * 抽象汽车类 * @author victor *@time 2013---2013-7-20---上午10:05:30 *@package 创建型模式.简单工厂模式 */public abstract class Auto {//车型名称private String name;//抽象的工作方法abstract public void run();//获得车型名称的方法public String getName(){return name;}//设置车型名称方法public void setName(String name){this.name=name;}}
具体产品类:
package 创建型模式.简单工厂模式;public class Bus extends Auto {public Bus(){this.setName("巴士");}@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("启动"+this.getName());}}
package 创建型模式.简单工厂模式;public class Car extends Auto {//构造方法public Car(){this.setName("轿车");}@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("启动"+this.getName());}}
package 创建型模式.简单工厂模式;public class Truck extends Auto {public Truck(){this.setName("卡车");}@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("启动"+this.getName());}}
静态工厂类:
package 创建型模式.简单工厂模式;import javax.management.RuntimeErrorException;public class StaticFactory {/** * 工厂方法 *//** * 工厂方法 * @param 车型编号 * @return 具体车对象 */public static Auto createAuto(int autoId){switch (autoId) {case 1:return new Car();case 2:return new Truck();case 3:return new Bus();default:throw new RuntimeException("没有本类型的车");}}}
客户类:
package 创建型模式.简单工厂模式;public class Client {/** * 简单工厂方法的优点: * 用代码和具体使用的类耦合度降低 * 令 创建和使用的代码向分离,可以独立的变化,易于扩展 * * 缺点: * 当产品类曾多时,工厂类只有一个,只能以不变应万变,这就是该模式的缺点 * * * *//** * @param args */public static void main(String[] args) {// TODO Auto-generated method stub//调用静态工厂里的方法创建对象Auto auto=StaticFactory.createAuto(1);auto.run();Auto auto2=StaticFactory.createAuto(2);auto2.run();Auto auto3=StaticFactory.createAuto(3);auto3.run();}}
========================================================================================================================================================================================================================================================================
工厂方法模式:
在工厂方法模式的实例中,Auto汽车抽象的代码并没有改变
package 创建型模式.工厂方法模式;public abstract class Auto {//车型名称private String name;//抽象的工作方法abstract public void run();//获得车型名称的方法public String getName(){return name;}//设置车型名称方法public void setName(String name){this.name=name;}}
package 创建型模式.工厂方法模式;public class Truck extends Auto {public Truck(){this.setName("卡车");}@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("启动"+this.getName());}}
package 创建型模式.工厂方法模式;public class Bus extends Auto {public Bus(){this.setName("汽车");}@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("启动"+this.getName());}}
package 创建型模式.工厂方法模式;public class Car extends Auto {public Car(){this.setName("轿车");}@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("启动"+this.getName());}}
工厂的抽象层次代码:
package 创建型模式.工厂方法模式;public abstract class Factory {/** * 抽象生产方法,将被子类重写, * return Auto的子类实例 */abstract public Auto createAuto();}
轿车工厂类:
package 创建型模式.工厂方法模式;public class CarFactory extends Factory {/** * 重写父类生产方法 */@Overridepublic Auto createAuto() {// TODO Auto-generated method stubreturn new Car();}}
package 创建型模式.工厂方法模式;public class BusFactory extends Factory {@Overridepublic Auto createAuto() {// TODO Auto-generated method stubreturn new Bus();}}
package 创建型模式.工厂方法模式;public class TruckFactory extends Factory {@Overridepublic Auto createAuto() {// TODO Auto-generated method stubreturn new Truck();}}
客户端:
package 创建型模式.工厂方法模式;public class Client2 {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stub//调用工厂方法创建不同的对象//创建变量,(使用抽象类描述,面向接口的编程)Factory factory;Auto auto;//创建Carfactory=new CarFactory();//创auto=factory.createAuto();//创建auto.run();//创建Busfactory=new BusFactory();auto=factory.createAuto();auto.run();//创建Truckfactory=new TruckFactory();auto=factory.createAuto();auto.run();}}
oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
下面在举个例子讲述工厂方法模式,:货物上架问题:
1。首先是一个货物抽象类:
有货物的名称,货物的宽度
package 创建型模式.工厂方法模式.货架;public abstract class Goods {//货物的名称,一厘米做单位private int width;private String name;public int getWidth() {return width;}public void setWidth(int width) {this.width = width;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
2.然后又三个类,分别是货物类,电视,电话,床
package 创建型模式.工厂方法模式.货架;public class Phone extends Goods{public Phone(){super();this.setName("电话机");this.setWidth(20);}}
package 创建型模式.工厂方法模式.货架;public class TV extends Goods {//构造方法public TV(){super();this.setName("电视机");this.setWidth(100);}}
package 创建型模式.工厂方法模式.货架;public class Bed extends Goods {public Bed(){super();this.setName("双人床");this.setWidth(300);}}
3.此时是一个货架抽象类:
货架的最大宽度,货架的名称
package 创建型模式.工厂方法模式.货架;public abstract class Shelf {private int maxWidth;//货架的宽度private String shelfname;//货架的名称public int getMaxWidth() {return maxWidth;}public void setMaxWidth(int maxWidth) {this.maxWidth = maxWidth;}public String getShelfname() {return shelfname;}public void setShelfname(String shelfname) {this.shelfname = shelfname;}public void put(Goods goods){System.out.println("将"+goods.getName()+"放入"+this.getShelfname());}}
此类有两个子类:
大货架,小货架
package 创建型模式.工厂方法模式.货架;public class BigShelf extends Shelf {public BigShelf(){super();this.setShelfname("大型货架类");this.setMaxWidth(200);}}
package 创建型模式.工厂方法模式.货架;public class SmallShelf extends Shelf {public SmallShelf(){super();this.setShelfname("小型货架类");this.setMaxWidth(90);}}
4货架抽象工厂类:
package 创建型模式.工厂方法模式.货架;public abstract class ShelfFactory {private int maxWidth;public int getMaxWidth() {return maxWidth;}public void setMaxWidth(int maxWidth) {this.maxWidth = maxWidth;}abstract public Shelf createShelf();}
下面是两个实现类与生产的两种货架一一对应
小型货架工厂:
package 创建型模式.工厂方法模式.货架;public class SmallShelfFacroty extends ShelfFactory {public SmallShelfFacroty(){super();this.setMaxWidth(new SmallShelf().getMaxWidth());}@Overridepublic Shelf createShelf() {// TODO Auto-generated method stubreturn new SmallShelf();}}
大型货架工厂
package 创建型模式.工厂方法模式.货架;public class BigShelfFactory extends ShelfFactory {public BigShelfFactory(){super();this.setMaxWidth(new BigShelf().getMaxWidth());}@Overridepublic Shelf createShelf() {// TODO Auto-generated method stubreturn new BigShelf();}}
由于客户端使用这三个抽象层次时,会发现很麻烦,所有涉及一个助手类:
package 创建型模式.工厂方法模式.货架;import java.util.ArrayList;import java.util.List;public class PlaceGoodsHelper {public synchronized static void placegoods(Goods goods){List<ShelfFactory> shelflist=new ArrayList<ShelfFactory>();shelflist.add(new SmallShelfFacroty());shelflist.add(new BigShelfFactory());//货架的变量Shelf rightshelf;for (ShelfFactory sf:shelflist) {//货架合适if (sf.getMaxWidth()>=goods.getWidth()) {//实例化特定的货架,放置货物try {rightshelf=sf.createShelf();rightshelf.put(goods);return;} catch (Exception e) {// TODO: handle exception}}throw new RuntimeException("么有找到合适的框架");}}}
客户端类:
package 创建型模式.工厂方法模式.货架;import java.util.ArrayList;import java.util.List;public class Client3 {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubList<Goods> goodslist=new ArrayList<Goods>();goodslist.add(new TV());goodslist.add(new Phone());goodslist.add(new Bed());System.out.println("货物初始化完毕");for (Goods goods:goodslist) {try {PlaceGoodsHelper.placegoods(goods);} catch (Exception e) {// TODO: handle exception}}System.out.println("货物放置完毕");}}
总结:
工厂方法模式是设计模式中应用最为广泛的模式之一。
工厂方法模式要解决的就是对象的创建时机问题,它提供了一种扩展的策略,这很好的符合了开放--封闭的原则。
- (4)设计模式方法-创建型设计模式--:简单工厂模式【【【工厂方法模式
- "围观"设计模式(8)--创建型之简单工厂模式、工厂方法模式、抽象工厂模式
- "围观"设计模式(8)--创建型之简单工厂模式、工厂方法模式、抽象工厂模式
- 设计模式-工厂模式(简单工厂模式+工厂方法模式)
- 设计模式-创建型模式-工厂方法
- 【设计模式】创建型模式-工厂方法
- 设计模式 - 工厂模式(简单,工厂方法,抽象工厂)
- Java设计模式--工厂模式(简单工厂+工厂方法)
- Java设计模式-工厂模式(简单工厂+工厂方法)
- 第一篇、创建型设计模式——简单工厂模式(静态工厂方法模式)
- 设计模式-工厂方法模式(创建型模式)
- 【23种设计模式】创建型模式 > 三个工厂模式(简单工厂、抽象工厂、工厂方法)
- 设计模式(4)工厂方法模式--创建型
- 设计模式-工厂模式(简单工厂,工厂方法,抽象工厂)
- 【JavaScript设计模式】创建型设计模式--简单工厂、工厂方法、抽象工厂
- 设计模式之工厂设计模式(一:简单工厂模式与工厂方法模式)
- 设计模式之简单工厂,工厂方法模式(c++)
- java 设计模式(简单工厂模式、工厂方法模式、单利模式、模板方法模式)
- 《数据通信与网络》笔记--虚电路网络:帧中继和ATM
- Android控件之——RadioGroup
- 如何学好C++ 用好类库很重要
- 成大事必备9种能力、9种手段、9种心态
- 删除信息前提示
- (4)设计模式方法-创建型设计模式--:简单工厂模式【【【工厂方法模式
- 怎么才能不学习、不工作。(懒人必看)
- 找工作
- java 构造函数是如何执行的
- enum singleton
- hdu1867之KMP
- [zz] main函数之前--谁动了我的main
- 以一个具体的例子,深入剖析一下Android系统的绑定机制
- NYOJ 14-会场安排问题