抽象工厂设计模式

/**

抽象工厂设计模式:与工厂设计模式是一样的,只不过抽象工厂是多产品系的。

工厂模式是单产品系的。

一个生产汽车的工厂,生产TopCar、TopBus,MidCar、MidBus,LowCar、LowBus.

利用抽象设计模式的方法,提取共同的特征。

当产生第四个SuperCar()类的时候,只需要在原来代码上增添SuperCar类实现接口,创建工厂即可。

而不需要再更改原来的代码。

*/

interface ICar{

//System.out.println("定义一些生产汽车共有的方法");

}

class TopCar implements ICar{

public TopCar(){

System.out.println("生产出高档汽车");

}

}

class MidCar implements ICar{

public MidCar(){

System.out.println("生产出中档汽车");

}

}

class LowCar implements ICar{

public LowCar(){

System.out.println("生产出低档汽车");

}

}

interface IBus{

//System.out.println("定义一些生产公共汽车共有的方法");

}

class TopBus implements IBus{

public TopBus(){

System.out.println("生产出高档公共汽车");

}

}

class MidBus implements IBus{

public MidBus(){

System.out.println("生产出中档公共汽车");

}

}

abstract class AbstractFactory{

public abstract  ICar creatCar();

public abstract  IBus creatBus();

}

class TopCarFactory extends AbstractFactory{

public ICar creatCar(){

return new TopCar();       //调用此方法后,相当于:ICar ic = new TopCar();

}

public IBus creatBus(){

return new TopBus();

}

}

class MidCarFactory extends AbstractFactory{

public ICar creatCar(){

return new MidCar();       //调用此方法后,相当于:ICar ic = new MidCar();

}

public IBus creatBus(){

return new MidBus();

}

}

class LowCarFactory extends AbstractFactory{

public ICar creatCar(){

return new LowCar();       //调用此方法后,相当于:ICar ic = new LowCar();

}

public IBus creatBus(){

return null;

}

}

public class AbstractFactoryDemos{

public static void main(String []args){

LowCarFactory lcf = new LowCarFactory();

lcf.creatCar();

lcf.creatBus();

}

}

//抽象工厂------例子2(文件读取)

/**

要求:

编写读文件功能。具体功能是:读取文本文件,包括(GBK,UTF-8,UNICoDe)编码下的文本文件,要求获得全文内容;

获取图像文件(BMP,GIF,JPG)文件,要求获得图像宽度、长度、每一点的RGB三基色信息。

定义泛型接口是解决返回值类型不同的较好方法,屏蔽方法参数个数差异利用“String ... in”形式实现。

*/

import java.io.*;

import javax.imageio.*;

import java.awt.image.*;

interface IRead<T>{

T read(String ... in);

}

class FileRead implements IRead<String>{

public String read(String ... in){   //可以传入多个参数

String result = null;

try{

File file = new File(in[0]);   //in[0]表示文件名

int len = 0;

FileInputStream input = new FileInputStream(file);

byte buf[] = new byte[1024];   //缓冲区大小等于文件长度

// FileOutputStream output = new FileOutputStream("");

// while((len=input.read(buf)) != -1){

// output.write(buf,0,len);

// }

input.read(buf);                   //一次性读完文件长度

result = new String(buf,in[1]);    //按in[1]编码方式转换成课件字符串

input.close();

}catch(Exception e){

e.getMessage();

}

return result;

}

}

class ImageInfo{

private int width;

private int height;

private int r[][];

private int g[][];

private int b[][];

public void setWidth(int width){

this.width = width;

}

public void setHeight(int height){

this.height = height;

}

public int[][] getR(){

return r;

}

public int[][] getG(){

return g;

}

public int[][] getB(){

return b;

}

public int getHeight() {

// TODO Auto-generated method stub

return height;

}

public int getWidth() {

// TODO Auto-generated method stub

return width;

}

public void setRGB(int rgb[]){

r = new int[height][width];

g= new int[height][width];

b= new int[height][width];

int pos = 0;

for(int i =0;i<height;i++){

pos = width * i;

for(int j =0;j<width;j++){   //这里是位运算的操作。

r[i][j] = (rgb[pos+j]&0xff0000)>>16;

g[i][j] = (rgb[pos+j]&0x00ff00)>>8;

b[i][j] = rgb[pos + j]&0x0000ff;

}

}

}

public String toString(){

return "width:"+this.getWidth()+" height:"+this.getHeight()+" r:"+this.getR()+" g:"+this.getG()+" b:"+this.getB();

}

}

class ImageRead implements IRead<ImageInfo>{  //读图像文件

BufferedImage bi = null;

public ImageInfo read(String ... in){

File file = new File(in[0]);
//in[0]表示图像的文件名

try{

/**

static BufferedImage read(File input)

返回一个 BufferedImage,作为使用 ImageReader(它是从当前已注册 ImageReader 中自动选择的)解码所提供 File 的结果。

*/

bi = ImageIO.read(file);

}catch(Exception e){

e.printStackTrace();

}

int width = bi.getWidth();

int height = bi.getHeight();

int rgb[] = new int[width * height];

//将数据图像读到result缓冲区

/**

int[] getRGB(int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize)

从图像数据的某一部分返回默认 RGB 颜色模型 (TYPE_INT_ARGB) 和默认 sRGB 颜色空间中整数像素数组。 */

bi.getRGB(0,0,width,height,rgb,width,height);

ImageInfo obj= new ImageInfo();      //设置图像信息

obj.setWidth(width);

obj.setHeight(height);

obj.setRGB(rgb);

return obj;

}

}

//自动选择工厂

abstract class AbstractFactory{

private static final String TEXT = "text";

private static final String IMAGE = "image";

abstract IRead creat();

static AbstractFactory creat(String mark){

AbstractFactory factory = null;

if(mark.equals(TEXT)){             //相当于:AbstractFactory factory = new TextFactory();

factory = new TextFactory();

}else if(mark.equals(IMAGE)){

factory = new ImageFactory();

}

return factory;

}

}

class TextFactory extends AbstractFactory{

public IRead creat(){
//IRead ifileread = new FileRead();

return new FileRead();

}

}

class ImageFactory extends AbstractFactory{

public IRead creat(){

return new ImageRead();

}

}

public class ReadInfoDemo{

public static void main(String []args){

String result = (String)AbstractFactory.creat("text").creat().read("F://JavaOracle/OOP/AbstractDemos.java","GBK");

//TextFactory tf = AbstractFactory.creat("text");

// IRead ifread = tf.creat();

//String result = ifread.read("F:/JavaOracle/OOP/AbstractDemos.java","GBK");

System.out.println("读取文件的信息:"+result);

ImageInfo ir = (ImageInfo)AbstractFactory.creat("image").creat().read("F://JavaOracle/18.png");

System.out.println("读取图片的信息:"+ir);

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 21:46:52

抽象工厂设计模式的相关文章

Abstract Factory Design Pattern 抽象工厂设计模式 - 总结

Abstract Factory Design Pattern 就是一般的Factory Design Pattern的进一步设计,增加一个抽象工厂,然后利用这个工厂可以创建不同基类的类. 当我们需要创建更多不同类的时候就可以使用这个设计模式了. 这个设计模式的代码相对会多点,但是其中的思想就是一般Factory Design Pattern,然后集合更多的基类,看起来挺大的一个设计模式,其思想是挺简单的. 其中具体的实现细节当然是可以有多种实现方法的: 1 利用Factory的基类衍生出不同的

用C# (.NET Core) 实现抽象工厂设计模式

本文的概念性内容来自深入浅出设计模式一书. 上一篇文章讲了简单工厂和工厂方法设计模式 http://www.cnblogs.com/cgzl/p/8760250.html, 使用的是披萨店的例子. 文将继续使用这个例子, 这里要用到抽象工厂. 披萨店的需求变更 现在披萨店在各地授权了很多连锁分店, 但是有的分店偷工减料, 使用劣质原料代替标准原料. 披萨店老板现在就是想解决这个问题. 原料的一致性问题 首先如何保证原料的质量问题? 可以建立一个工厂生产原料, 然后把原料分发到各地的授权店. 然后

简单工厂、多态工厂和抽象工厂设计模式的比较

工厂模式的主要作用就是封装对象的创建过程,使得程序员不必准确指定创建对象所需要的构造函数,这样做的一个好处就是增加了程序的可扩展性.由于每个面向对象应用程序的设计都需要创建对象,并且由于人们可能需要通过增加新的类型来扩展应用程序,工厂模式可能是最有用的设计模式之一. 总的来说,工厂模式主要分为三种类型:简单工厂模式.多态工厂模式.抽象工厂模式.这三种模式都属于设计模式中的创建行模式,他们多多少少在设计上有些相似之处,其最终的目的都是为了将对象的实例化部分取出来,进而优化系统的架构,增加程序的可扩

c# 抽象工厂设计模式

原文地址:https://www.cnblogs.com/fanweisheng/p/11517678.html

JAVA设计模式--抽象工厂模式

抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关.是具体工厂角色必须实现的接口或者必须继承的父类.在java中它由抽象类或者接口来实现.具体工厂角色:它含有和具体业务逻辑有关的代码.由应用程序调用以创建对应的具体产品的对象.在java中它由具体的类来实现.抽象产品角色:它是具体产品继承的父类或者是实现的接口.在java中一般

iOS 设计模式之抽象工厂

设计模式是程序提升的必备知识,这里说下iOS如何实现抽象工厂设计模式.本文是看过oc编程之道这本的抽象工厂这章后写出的,如果不明白原理可以看看那本书. TestView.h首先创建一个视图 // // TestView.h // AbstractFactory // // Created by 杜甲 on 11/10/14. // Copyright (c) 2014 杜甲. All rights reserved. // #import <UIKit/UIKit.h> @interface

iOS设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

1. 简单工厂模式 如何理解简单工厂,工厂方法, 抽象工厂三种设计模式? 简单工厂的生活场景,卖早点的小摊贩,他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂,它生产包子,馒头,地沟油烙的煎饼.该场景对应的UML图如下所示: 图1:简单工厂模式UML图 简单工厂模式的参与者: 工厂(Factory)角色:接受客户端的请求,通过请求负责创建相应的产品对象. 抽象产品(Abstract Product)角色: 是工厂模式所创建对象的父类或是共同拥有的接口.可是抽象类或接口. 具体产品(Conc

设计模式——抽象工厂模式学习

要想正确的理解设计模式,首先必须明确它是为了解决什么问题而提出来的. 抽象工厂设计模式概念: 针对抽象工厂这个设计模式,我查找了不少资料,感觉只有涉及产品级别和产品族的才是理解了抽象工厂设计模式的精髓,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构.有些观点认为抽象工厂模式是为了解决客户端代码与工厂类的耦合问题,我认为这种观点的解决方案只是简单工厂模式的一个应用,而这种观点认为的抽象工厂模式是: 工厂模式+简单工厂模式=抽象工厂模式,这是不正确. 针对的问题: 针对

【设计模式】创建型模式之抽象工厂Abstract Factory

抽象工厂Abstract Factory是一种创建型设计模式,目的在于提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.抽象工厂的类图如下,客户仅与抽象类定义的定义的接口交互,而不使用特定的具体类的接口.一个系统包含多种产品时,AbstractFactory声明创建各种抽象产品对象的操作接口,这些接口是直接暴露给Client的,而具体产品对象的创建则延迟到子类ConcreteFactory,Client面对的产品类是AbstractProduct,无需关系具体产品类是什么.在运