一:简单工厂:

有一个实际工厂,这个工厂只能造一类的产品,这一类产品就是一个产品接口,会有多个具体产品实现这个接口,例 如,一个手机厂,生产苹果手机,三星手机;

缺点:在工厂类中集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;对系统的维护和扩展不利;

使用场景:负责创建的对象比较少;客户只知道传入工厂类的参数,对于如何创建对象的逻辑不关心;容易违反高内聚责任分配原则,所以只在很简单的情况下应用;

package com.designPattern.simpleFactory;

public interface Shape {   // 产品接口

public String toString();

}

package com.designPattern.simpleFactory;

public class ShapeA implements Shape {  // 具体产品

@Override
public String toString()
{
return "shape A";
}
}

package com.designPattern.simpleFactory;

public class ShapeB implements Shape {  // 具体产品
@Override
public String toString()
{
return "shape B";
}
}

package com.designPattern.simpleFactory;

public class ShapeFactory {

public static Shape createShape(String shapeStr)
{
switch(shapeStr)
{
case "ShapeA": return new ShapeA();
case "ShapeB": return new ShapeB();
}
return null;
}

public static void main(String[] args)
{
Shape A = ShapeFactory.createShape("ShapeA");
Shape B = ShapeFactory.createShape("ShapeB");

System.out.println(A);
System.out.println(B);
}
}

二:工厂方法:

比简单工厂高级一点了,一个工厂的接口,多个工厂实现这个工厂接口,一个产品接口,多个具体产品实现这个产品接口,例如,一个手机厂接口,有苹果手机厂,三星手机厂两个具体工厂,苹果手机厂生产苹果手机,三星手机厂生产三星手机;可以在不修改具体工厂角色的情况下引用新的产品,一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品。

使用场景:对于某个产品,调用者清楚知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来;   

package com.designPattern.factoryMethod;

public interface Car {    // 产品接口
void gotowork();
}

package com.designPattern.factoryMethod;

public interface ICarFactory {  // 生产产品的类厂接口

Car getCar();
}

package com.designPattern.factoryMethod;

public class Bike implements Car {  //  具体产品
@Override
public void gotowork() {
// TODO Auto-generated method stub
}
}

package com.designPattern.factoryMethod;
public class Bus implements Car {  // 具体产品
@Override
public void gotowork() {
}
}

package com.designPattern.factoryMethod;

public class BikeFactory implements ICarFactory {  // 具体产品工厂

@Override
public Car getCar() {
// TODO Auto-generated method stub
return null;
}
}

package com.designPattern.factoryMethod;

public class BusFactory implements ICarFactory {  // 具体产品工厂
@Override
public Car getCar() {
return null;
}
}

package com.designPattern.factoryMethod;
public class TestFactory {
public static void main(String[] args)
{
ICarFactory factory = null;

factory = new BikeFactory();
Car bike = factory.getCar();
bike.gotowork();

factory = new BusFactory();
Car bus = factory.getCar();
bus.gotowork();
}
}

三:抽象工厂:

前两种工厂,说到底都只能生产一类产品(都是手机),抽象工厂支持多种类型的产品。一个工厂接口,多个 具体工厂,多个产品接口,多个具体产品,例如,电器厂接口,有三星厂和苹果厂两个具体工厂,三星厂生产三星手机,  三星电脑,苹果厂生产苹果手机,苹果电脑。户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。

package com.designPattern.abstractFactory;

public interface AbstractFactory {  // 抽象工厂
public ProductA factoryA();
public ProductB factoryB();
}

package com.designPattern.abstractFactory;

public class ConcreateFacotry1 implements AbstractFactory {   //具体工厂

@Override
public ProductA factoryA() {

return new ConcreateProductA1();
}

@Override
public ProductB factoryB() {
return new ConcreateProductB1();
}

}

package com.designPattern.abstractFactory;

public class ConcreateFactory2 implements AbstractFactory {  //具体工厂

@Override
public ProductA factoryA() {
return new ConcreateProductA2();
}

@Override
public ProductB factoryB() {
// TODO Auto-generated method stub
return new ConcreateProductB2();
}
}

package com.designPattern.abstractFactory;

public interface ProductA {   // 抽象产品
public void method1();
public void method2();

}

package com.designPattern.abstractFactory;

public interface ProductB {  // // 抽象产品
public void method1();
public void method2();
}

package com.designPattern.abstractFactory;

public class ConcreateProductA1 implements ProductA {     // 具体产品

@Override
public void method1() {
System.out.println("等级为1的A的method1");

}

@Override
public void method2() {
System.out.println("等级为1的A的method2");
}
}

package com.designPattern.abstractFactory;

public class ConcreateProductA2 implements ProductA {   // 具体产品

@Override
public void method1() {
System.out.println("等级为2的A的method1");
}

@Override
public void method2() {
System.out.println("等级为2的A的method2");
}

}

package com.designPattern.abstractFactory;

public class ConcreateProductB1 implements ProductB {  // 具体产品

@Override
public void method1() {
System.out.println("等级为1的B的method1");
}

@Override
public void method2() {
System.out.println("等级为1的B的method2");
}

}

package com.designPattern.abstractFactory;

public class ConcreateProductB2 implements ProductB {  // 具体产品

@Override
public void method1() {
System.out.println("等级为2的产品B的method1()");
}

@Override
public void method2() {
System.out.println("等级为2的产品B的method2()");
}

}

package com.designPattern.abstractFactory;

public class test {

public static void main(String[] args) {

AbstractFactory ff = new ConcreateFacotry1();

ProductA aa = ff.factoryA();
ProductB bb = ff.factoryB();

aa.method1();
aa.method2();

bb.method1();
bb.method2();

AbstractFactory f2 = new ConcreateFactory2();
aa = f2.factoryA();
bb = f2.factoryB();

aa.method1();
aa.method2();

bb.method1();
bb.method2();
}
}

设计模式—三种工厂模式(JAVA)的更多相关文章

  1. java设计模式---三种工厂模式之间的区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  2. java设计模式三种工厂模式简单介绍

    一.简单工厂模式 概述:简单工厂模式的创建意图就是,把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了.而这种方法的缺点也很明显,违背了设计 ...

  3. java设计模式---三种工厂模式

    工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...

  4. 三种工厂模式的分析以及C++实现

    三种工厂模式的分析以及C++实现 以下是我自己学习设计模式的思考总结. 简单工厂模式 简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型, ...

  5. java三种工厂模式

    适用场合: 7.3 工厂模式的适用场合 创建新对象最简单的办法是使用new关键字和具体类.只有在某些场合下,创建和维护对象工厂所带来的额外复杂性才是物有所值.本节概括了这些场合. 7.3.1 动态实现 ...

  6. java 三种工厂模式

    一.简单工厂模式 一个栗子: 我喜欢吃面条,抽象一个面条基类,(接口也可以),这是产品的抽象类. public abstract class INoodles { /** * 描述每种面条啥样的 */ ...

  7. 深入理解Java的三种工厂模式

    一.简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类 实现汽车接口 public interface Car { S ...

  8. Java的三种工厂模式

    一.简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类 实现汽车接口 //产品接口 //汽车需要满足一定的标准 pub ...

  9. Java设计模式之三种工厂模式

    工厂模式实现了创建者和调用者的分离,实现了更好的解耦.   详细分类: 1) 简单工厂模式(静态工厂模式): 2) 工厂方法模式: 3) 抽象工厂模式 面向对象设计的基本原则: 1)       OC ...

随机推荐

  1. vue.js 源代码学习笔记 ----- 工具方法 perf

    import { inBrowser } from './env' export let mark export let measure if (process.env.NODE_ENV !== 'p ...

  2. 微信测试帐号如何设置URL和Token,以及相关验证的原理

    首先说明,本帮助文档是利用javaweb的Servlet来进行“接口配置信息配置信息”认证的. 在学习微信公众号开发的时候,读到填写服务器配置的帮助部分,总是不能理解为啥按照他的步骤做总是设置失败(吐 ...

  3. for循环打印等腰三角形、直角三角形、菱形

    一.等腰三角形 package s1; import java.util.Scanner; public class C31 { public static void main(String[] ar ...

  4. [置顶] 完美解决Android Studio 运行时出现的警告信息?

    今天群友看到他说运行的时候报下面的错,我记得我之前导入百度地图也是遇到过,运行的时候一堆警告信息,然后编译失败等的,特别郁闷,其实后来在网上查了下,原来是很多第三方里面加个混淆,然后你有找不到那些方法 ...

  5. Vue Devtools--vue调式工具

    当浏览器控制台出现:Download the Vue Devtools extension for a better development experience: 1:安装 地址:https://g ...

  6. fedora26 Mysql 开放远程链接服务

    下载安装MySQL 用以下指令安装 $ dnf install mysql-server 注意:Fedora默认安装mariadb 安装完成之后,用以下指令测试 $ mysql --version 开 ...

  7. 【排序】冒泡排序,C++实现

    原创文章,转载请注明出处! 博客文章索引地址 博客文章中代码的github地址 # 基本思想(从小到大排序)       对于给定的n个元素,从第一个元素开始,依次对相邻的两个元素进行比较,当前面的记 ...

  8. Hibernate 一对一 (one-to-one)

    一对一(one-to-one)实例(Person-IdCard) 一对一的关系在数据库中表示为主外关系.例如.人和身份证的关系.每个人都对应一个身份证号.我们应该两个表.一个是关于人信息的表(Pers ...

  9. js 值和引用

    js对值和引用的赋值/传递在语法上没有区别,完全根据值得类型决定 简单值(即标量基本类型值),总是通过值复制的方式来赋值/传递,包括null,undefined,字符串,数字,布尔值和ES6中的sym ...

  10. iOS开发之html解析

    使用XPath解析html 可以从此处https://github.com/topfunky/hpple下载工程,将TFHpple.h,TFHpple.m,TFHppleElement.h,TFHpp ...